home *** CD-ROM | disk | FTP | other *** search
/ Aminet 37 / Aminet 37 (2000)(Schatztruhe)[!][Jun 2000].iso / Aminet / dev / asm / Tandem2.68.lha / Tandem / Includes / Tandem.i < prev   
Text File  |  2000-04-02  |  498KB  |  18,513 lines

  1. * tandem.library.asm  revision 2.62 3.24.00    *  n.b. See also VERSION in
  2. * Tandem.i            revision 2.62 3.24.00    *  tandem.library section!!
  3. * Front.i             revision 2.62 3.24.00    *  (extract from Tandem.i)
  4.  
  5.  include 'IncAll.i'        ;get AmigaOS includes & FDs
  6.  
  7. ************************* set what assembled ***************************
  8.  
  9. xxp_what: EQU  2  ;set:  0=tandem.library  1=front.i  2=tandem.i
  10.  
  11. * If xxp_what=1, remove all lines from line starting with *####....
  12.  
  13. ************************* data & structures ****************************
  14.  
  15.  IFNE xxp_what             ;#^1 only assemble this if not in tandem.library
  16.  
  17. * begin warmup ready to call Program
  18. TLColdstart:
  19.  tst.l (a7)                ;always NE (but tandem sets EQ if debugging)
  20.  sub.l #1024,a7            ;create instance of xxp_tndm
  21.  move.l a7,a4              ;a4 points to xxp_tndm
  22.  seq d7                    ;D7=-1 if debugging, else 0
  23.  ext.w d7
  24.  
  25.  move.l a7,a6              ;clear the xxp_tndm structure
  26.  add.w #1024,a6
  27. .clrr:
  28.  clr.l -(a6)
  29.  cmp.l a4,a6
  30.  bne .clrr
  31.  
  32.  move.w d7,xxp_tand(a4)    ;xxp_tand=-1 if debugging, else 0
  33.  move.l a0,xxp_A0D0+0(a4)  ;save CLI parameters addr & len
  34.  move.l d0,xxp_A0D0+4(a4)
  35.  
  36.  move.l _AbsExecBase,a6
  37.  move.l a6,xxp_sysb(a4)    ;set xxp_sysb
  38.  sub.l a1,a1               ;for current task..
  39.  jsr _LVOFindTask(a6)      ;.. find own Process structure
  40.  move.l d0,a2              ;(A2) = our own Process structure
  41.  tst.l pr_CLI(a2)          ;pr_CLI<>0 if from CLI
  42.  bne.s .cli                ;go if from CLI
  43.  
  44.  lea pr_MsgPort(a2),a0     ;wait for workbench startup message to arrive
  45.  jsr _LVOWaitPort(a6)
  46.  lea pr_MsgPort(a2),a0     ;get workbench startup message now it's here
  47.  jsr _LVOGetMsg(a6)
  48.  move.l d0,xxp_bnch(a4)    ;remember the message, for replying &c
  49.  
  50. .cli:
  51.  move.l #strings,xxp_strg(a4)    ;Program must contain 'strings: DC.B 0'
  52.  
  53.  moveq #-1,d7              ;will be 0 if dos.library < xxp_lver
  54.  lea .dosn,a1              ;open dos.library
  55.  moveq #xxp_lver,d0        ;at least version xxp_lver
  56.  jsr _LVOOpenLibrary(a6)
  57.  move.l d0,xxp_dosb(a4)    ;set dosbase
  58.  bne.s .doso               ;go if dos.library open
  59.  
  60.  moveq #0,d7               ;signal libraries < version xxp_lver
  61.  moveq #0,d0               ;open earlier dos.library so can report error
  62.  lea .dosn,a1
  63.  jsr _LVOOpenLibrary(a6)
  64.  move.l d0,xxp_dosb(a4)
  65.  beq .kill                 ;go if can't open earlier dos.library (unlikely)
  66.  
  67. .doso:
  68.  move.l d0,a6              ;ready A6 for dos.library calls
  69.  tst.l xxp_bnch(a4)        ;go if workbench
  70.  bne.s .bench
  71.  
  72.  jsr _LVOInput(a6)         ;if CLI, xxp_iput = CLI input stream
  73.  move.l d0,xxp_iput(a4)
  74.  jsr _LVOOutput(a6)        ;if CLI, xxp_oput = CLI output stream
  75.  move.l d0,xxp_oput(a4)
  76.  bra.s .both               ;& continue
  77.  
  78. .bench:
  79.  move.l #.conn,d1          ;if workbench, open a console
  80.  move.l #MODE_NEWFILE,d2
  81.  jsr _LVOOpen(a6)
  82.  move.l d0,xxp_iput(a4)    ;if workbench, xxp_iput = console
  83.  move.l d0,xxp_oput(a4)    ;if workbench, xxp_oput = console
  84.  beq .kill                 ;abort if can't open console (unlikely)
  85.  
  86. .both:
  87.  tst.w d7                  ;report & quit if dos.library < xxp_lver
  88.  beq .badv
  89.  
  90.  move.l xxp_sysb(a4),a6    ;open other libraries
  91.  lea .intn,a1
  92.  moveq #xxp_lver,d0
  93.  jsr _LVOOpenLibrary(a6)   ;intuition.library
  94.  move.l d0,xxp_intb(a4)
  95.  beq .badv
  96.  lea .gfxn,a1              ;graphics.library
  97.  moveq #xxp_lver,d0
  98.  jsr _LVOOpenLibrary(a6)
  99.  move.l d0,xxp_gfxb(a4)
  100.  beq .badv
  101.  lea .asln,a1              ;asl.library
  102.  moveq #xxp_lver,d0
  103.  jsr _LVOOpenLibrary(a6)
  104.  move.l d0,xxp_aslb(a4)
  105.  beq .badv
  106.  lea .gadn,a1              ;gadtools.library
  107.  moveq #xxp_lver,d0
  108.  jsr _LVOOpenLibrary(a6)
  109.  move.l d0,xxp_gadb(a4)
  110.  beq .badv
  111.  
  112.  move.l xxp_dosb(a4),a6    ;CD to progdir, set xxp_cdir
  113.  jsr _LVOGetProgramDir(a6)
  114.  move.l d0,d1
  115.  jsr _LVOCurrentDir(a6)
  116.  move.l d0,xxp_cdir(a4)    ;save aboriginal CD
  117.  move.l xxp_sysb(a4),a6
  118.  
  119.  IFEQ xxp_what-1           ;#^2  Only open tandem.library if in Front.i
  120.  lea .tann,a1
  121.  moveq #xxp_tver,d0
  122.  jsr _LVOOpenLibrary(a6)
  123.  bsr .abdir
  124.  move.l d0,xxp_tanb(a4)
  125.  beq.s .badt               ;quit if can't
  126.  ENDC                      ;^2
  127.  
  128.  IFEQ xxp_what-2           ;#^3    ;} (dummy xxp_tanb if in tandem.i)
  129.  move.l #TLEndcode+24,xxp_tanb(a4) ;} (as if in tandem.library)
  130.  bsr .abdir
  131.  ENDC                      ;#^3
  132.  
  133.  move.l 1028(a4),d0        ;get val above root of stack (=size if CLI)
  134.  sub.l #1036,d0            ;adjust for Front.i usage
  135.  move.l d0,-(a7)           ;put CLI stack size above return addr of Program
  136.  move.l xxp_A0D0+0(a4),a0  ;restore A0,D0 as called (meaningful if CLI)
  137.  move.l xxp_A0D0+4(a4),d0
  138.  jsr Program               ;* do user program (A4=xxp_tndm, A6=xxp_sysb)
  139.  addq.l #4,a7              ;slough stack size
  140.  
  141.  move.l a7,a4              ;reload A4 with xxp_tndm
  142.  bsr .abdir                ;back to aboriginal CD (if changed by Program)
  143.  move.l xxp_tanb(a4),a6
  144.  jsr _LVOTLWclose(a6)      ;call TLWclose (closes everything in xxp_tndm)
  145.  moveq #0,d0               ;signal ok
  146.  tst.w xxp_ackn(a4)
  147.  beq .wrap                 ;ok if ack=0
  148.  
  149.  move.l #.brep,d2          ;else, wait for acknowledge, return bad
  150.  move.l #.dosn-.brep,d3
  151.  bra.s .bad
  152.  
  153. .badt:                     ;branch here if can't open tandem.library
  154.  move.l #.trep,d2
  155.  move.l #.lrep-.trep,d3
  156.  bra.s .bad
  157.  
  158. .badv:                     ;branch here if library version < xxp_lver
  159.  move.l #.lrep,d2
  160.  move.l #.dosn-.lrep,d3
  161.  
  162. .bad:
  163.  move.l xxp_oput(a4),d1    ;send error message
  164.  move.l xxp_dosb(a4),a6
  165.  jsr _LVOWrite(a6)
  166.  move.l a4,d2              ;wait for acknowledge
  167.  moveq #10,d3
  168.  move.l xxp_iput(a4),d1
  169.  jsr _LVORead(a6)
  170.  
  171. .kill:
  172.  moveq #-1,d0              ;signal bad (can't open console/libraries)
  173.  
  174. .wrap:
  175.  move.l d0,-(a7)           ;remember error code
  176.  move.l xxp_sysb(a4),a6
  177.  
  178.  IFEQ xxp_what-1           ;#^4
  179.  move.l xxp_tanb(a4),d0    ;(only close tandem.library if xxp_what=1)
  180.  bsr .clib                 ;(uses dummy tanbase if xxp_what=2)
  181.  ENDC                      ;#^4
  182.  
  183.  move.l xxp_gadb(a4),d0    ;close libraries (exc dos.library)
  184.  bsr .clib
  185.  move.l xxp_intb(a4),d0
  186.  bsr .clib
  187.  move.l xxp_aslb(a4),d0
  188.  bsr .clib
  189.  move.l xxp_gfxb(a4),d0
  190.  bsr .clib
  191.  
  192.  tst.l xxp_bnch(a4)        ;go if CLI
  193.  beq.s .ccli
  194.  
  195.  move.l xxp_oput(a4),d1    ;close console if open
  196.  beq.s .ccon
  197.  move.l xxp_dosb(a4),a6
  198.  jsr _LVOClose(a6)
  199. .ccon:
  200.  move.l xxp_sysb(a4),a6    ;reply to workbench startup message
  201.  jsr _LVOForbid(a6)
  202.  move.l xxp_bnch(a4),a1
  203.  jsr _LVOReplyMsg(a6)
  204.  
  205. .ccli:
  206.  move.l xxp_dosb(a4),d0    ;close dos.library
  207.  bsr .clib
  208.  move.l (a7)+,d0           ;error code (0 if ok, -1 if bad) in D0
  209.  add.l #1024,a7            ;restore stack
  210.  rts                       ;exit back to workbench/CLI
  211.  
  212. .clib:                     ;** close a library - base at d0 (EQ if unopened)
  213.  beq.s .clibq
  214.  move.l d0,a1
  215.  jsr _LVOCloseLibrary(a6)
  216. .clibq:
  217.  rts
  218.  
  219. .abdir:                    ;** CD back to aboriginal CD
  220.  movem.l d0-d1/a0-a1/a6,-(a7)
  221.  move.l xxp_dosb(a4),a6
  222.  move.l xxp_cdir(a4),d1
  223.  jsr _LVOCurrentDir(a6)
  224.  movem.l (a7)+,d0-d1/a0-a1/a6
  225.  rts
  226.  
  227. .trep: dc.b 'Error: can''t open tandem.library',$0A                ;}
  228.  dc.b '(Press <return> to acknowledge)',$0A,0                      ;} do
  229. .lrep: dc.b 'Error: must be release 2.04+ of operating system',$0A ;} not
  230. .brep: dc.b '(Press <return> to acknowledge)',$0A,0                ;} inter-
  231. .dosn: dc.b 'dos.library',0                                        ;} pose
  232. .intn: dc.b 'intuition.library',0
  233. .gfxn: dc.b 'graphics.library',0
  234. .asln: dc.b 'asl.library',0
  235. .gadn: dc.b 'gadtools.library',0
  236. .conn: dc.b 'CON:20/10/320/50/Console',0
  237. .tann: dc.b 'tandem.library',0
  238.  ds.w 0
  239.  
  240.  ENDC                      ;#^1
  241.  
  242.                            ;** This is the end of Front.i **
  243.                            ;If saving INC:Front.i, first chop off this line
  244.                            ;and all subsequent lines (& set xxp_what EQU 1)
  245.  
  246. *#######################################################################
  247.  
  248.  IFEQ xxp_what             ;#^5 if xxp_what=0, assemble as tandem.library
  249.  
  250.  STRUCTURE TandemBase,LIB_SIZE ;this section based on sample in RKM
  251.  UBYTE sb_Flags
  252.  UBYTE sb_pad
  253.  ULONG sb_SysLib           ;this is longword aligned
  254.  ULONG sb_DosLib
  255.  ULONG sb_SegList
  256.  LABEL TandemBase_SIZEOF
  257.  
  258. SAMPLENAME: MACRO
  259.  DC.B 'tandem.library',0
  260.  ENDM
  261.  
  262. VERSION: EQU 37
  263. REVISION: EQU 262
  264.  
  265. DATE: MACRO
  266.  dc.b '3.24.00'
  267.  ENDM
  268.  
  269. VERS: MACRO
  270.  dc.b 'tandem 37.262'
  271.  ENDM
  272.  
  273. VSTRING: MACRO
  274.  dc.b 'tandem 37.262 (3.24.00)',13,10,0
  275.  ENDM
  276.  
  277. VERSTAG: MACRO
  278.  dc.b 0,'$VER: tandem 37.262 (3.24.00)',0
  279.  ENDM
  280.  
  281. * dummy entry point - return with error
  282.  moveq #-1,d0
  283.  rts
  284.  
  285. * library priority (always 0)
  286. MYPRI: equ 0
  287.  
  288. * this is the RomTag structure for the library
  289. RomTag:                    ;STRUCTURE RT,0
  290.  dc.w RTC_MATCHWORD        ;UWORD RT_MATCHWORD
  291.  dc.l RomTag               ;APTR RT_MATCHTAG
  292.  dc.l TLEndcode            ;APTR RT_ENDSKIP
  293.  dc.b RTF_AUTOINIT         ;UBYTE RT_FLAGS
  294.  dc.b VERSION              ;UBYTE RT_VERSION
  295.  dc.b NT_LIBRARY           ;UBYTE RT_TYPE
  296.  dc.b MYPRI                ;BYTE RT_PRI
  297.  dc.l LibName              ;APTR RT_NAME
  298.  dc.l IDString             ;APTR RT_IDSTRING
  299.  dc.l InitTable            ;APTR RT_INIT
  300.  
  301. IDString: VSTRING
  302. LibName: SAMPLENAME
  303. dosName: DOSNAME
  304.  ds.w 0
  305.  
  306. InitTable:
  307.  dc.l TandemBase_SIZEOF
  308.  dc.l funcTable
  309.  dc.l dataTable
  310.  dc.l initRoutine
  311.  
  312. funcTable:
  313.  dc.l Open
  314.  dc.l Close
  315.  dc.l Expunge
  316.  dc.l 0
  317.  
  318.  dc.l TLFsub
  319.  dc.l TLStrbuf
  320.  dc.l TLStra0
  321.  dc.l TLError
  322.  dc.l TLOpenread
  323.  dc.l TLOpenwrite
  324.  dc.l TLWritefile
  325.  dc.l TLReadfile
  326.  dc.l TLClosefile
  327.  dc.l TLAschex
  328.  dc.l TLHexasc
  329.  dc.l TLOutput
  330.  dc.l TLInput
  331.  dc.l TLPublic
  332.  dc.l TLChip
  333.  dc.l TLProgdir
  334.  dc.l TLKeyboard
  335.  dc.l TLWindow
  336.  dc.l TLWclose
  337.  dc.l TLText
  338.  dc.l TLTsize
  339.  dc.l TLWfront
  340.  dc.l TLGetfont
  341.  dc.l TLNewfont
  342.  dc.l TLButmon
  343.  dc.l TLAslfont
  344.  dc.l TLAslfile
  345.  dc.l TLWslof
  346.  dc.l TLReqbev
  347.  dc.l TLReqarea
  348.  dc.l TLReqcls
  349.  dc.l TLReqfull
  350.  dc.l TLReqchoose
  351.  dc.l TLReqinput
  352.  dc.l TLReqedit
  353.  dc.l TLReqshow
  354.  dc.l TLAssdev
  355.  dc.l TLReqmenu
  356.  dc.l TLReqmuset
  357.  dc.l TLReqmuclr
  358.  dc.l TLReqinfo
  359.  dc.l TLWpoll
  360.  dc.l TLTrim
  361.  dc.l TLWsub
  362.  dc.l TLWpop
  363.  dc.l TLMultiline
  364.  dc.l TLWupdate
  365.  dc.l TLWcheck
  366.  dc.l TLFloat
  367.  dc.l TLBusy
  368.  dc.l TLUnbusy
  369.  dc.l TLReqcolor
  370.  dc.l TLOnmenu
  371.  dc.l TLOffmenu
  372.  dc.l TLPrefdir
  373.  dc.l TLPreffil
  374.  dc.l TLButstr
  375.  dc.l TLButprt
  376.  dc.l TLButtxt
  377.  dc.l TLSlider
  378.  dc.l TLPassword
  379.  dc.l TLSlimon
  380.  dc.l TLReqredi
  381.  dc.l TLReqchek
  382.  dc.l TLReqon
  383.  dc.l TLReqoff
  384.  dc.l TLGetilbm
  385.  dc.l TLPutilbm
  386.  dc.l TLResize
  387.  dc.l TLProgress
  388.  dc.l TLData
  389.  dc.l TLEllipse
  390.  dc.l TLGetarea
  391.  dc.l TLHexasc16
  392.  dc.l TLDropdown
  393.  dc.l TLReqfont
  394.  dc.l TLWscroll
  395.  dc.l TLPrefs
  396.  dc.l TLMget
  397.  dc.l TLTabs
  398.  dc.l TLTabmon
  399.  dc.l TLPict
  400.  
  401.  dc.l -1
  402.  
  403. dataTable:
  404.  INITBYTE LN_TYPE,NT_LIBRARY
  405.  INITLONG LN_NAME,LibName
  406.  INITBYTE LIB_FLAGS,LIBF_SUMUSED!LIBF_CHANGED
  407.  INITWORD LIB_VERSION,VERSION
  408.  INITWORD LIB_REVISION,REVISION
  409.  INITLONG LIB_IDSTRING,IDString
  410.  DC.L 0
  411.  
  412. * this routine gets called after the library has been allocated
  413. * A6=sysbase  A0=segment list  D0=library pointer
  414. initRoutine:
  415.  move.l a5,-(a7)           ;save a5
  416.  move.l d0,a5              ;library pointer to a5
  417.  move.l a6,sb_SysLib(a5)   ;set sb_SysLib
  418.  move.l a0,sb_SegList(a5)  ;save a pointer to my loaded code
  419.  lea dosName(pc),a1
  420.  moveq #0,d0
  421.  jsr _LVOOpenLibrary(a6)
  422.  move.l d0,sb_DosLib(a5)   ;set sb_DosLib
  423.  bne.s 1$
  424.  ALERT AG_OpenLib!AO_DOSLib ;(crash if can't open dos.library)
  425. 1$:
  426.  move.l a5,d0
  427.  move.l (a7)+,a5
  428.  rts
  429.  
  430. * this is called when the user opens library
  431. * a6=my library ptr  d0=version
  432. Open:
  433.  addq.w #1,LIB_OPENCNT(a6) ;bump opener count
  434.  bclr #LIBB_DELEXP,sb_Flags(a6) ;stop delayed expunge
  435.  move.l a6,d0              ;signals that open was successful
  436.  rts
  437.  
  438. * this gets called when the user closes the library
  439. * A6=my library pointer
  440. Close:
  441.  moveq #0,d0               ;return value
  442.  subq.w #1,LIB_OPENCNT(a6) ;reduce opener count
  443.  bne.s 1$                  ;go if still some users
  444.  btst #LIBB_DELEXP,sb_Flags(a6) ;is there a delayed expunge pending?
  445.  beq.s 1$                  ;no, go
  446.  bsr Expunge               ;yes, expunge me
  447. 1$:
  448.  rts
  449.  
  450. * expunge the library
  451. * A6=tandem.library pointer
  452. Expunge:
  453.  movem.l d2/a5-a6,-(a7)
  454.  move.l a6,a5
  455.  move.l sb_SysLib(a5),a6
  456.  tst.w LIB_OPENCNT(a5)
  457.  beq.s 1$
  458.  bset #LIBB_DELEXP,sb_Flags(a5)
  459.  moveq #0,d0
  460.  bra.s 2$
  461. 1$:
  462.  move.l sb_SegList(a5),d2
  463.  move.l a5,a1
  464.  jsr _LVORemove(a6)
  465.  move.l sb_DosLib(a5),a1
  466.  jsr _LVOCloseLibrary(a6)
  467.  moveq #0,d0
  468.  move.l a5,a1
  469.  move.w LIB_NEGSIZE(a5),d0
  470.  sub.l d0,a1
  471.  add.w LIB_POSSIZE(a5),d0
  472.  jsr _LVOFreeMem(a6)
  473.  move.l d2,d0
  474. 2$:
  475.  movem.l (a7)+,d2/a5-a6
  476.  rts
  477.  
  478.  ENDC                      ;#^5
  479.  
  480. ********************* subroutines that do the work **********************
  481.  
  482. *>>>> edit a string in xxp_AcWind
  483. TLReqedit:
  484.  
  485. ;on call:      D0 = lhs of tablet
  486. ;              D1 = top of tablet
  487. ;              A0 = tags (all start with xxp_x....)
  488.  
  489. ; xxp_chnd     bit 31     1 if text/styl changed
  490. ; on return    bit 16-30  offset
  491. ;              bit 15     1 if continuation line in FWork+512,768
  492. ;              bit 14     1 if cursor is in continuation line
  493. ;              bit 13     1 if line is complemented
  494. ;              bit 12     1 if return code = 8-11 (i.e. error conditions)
  495. ;              bit 11     1 if force proportional font -> fixed
  496. ;              bit 10     1 if justification changed
  497. ;              bit 8-9    00 ljust   01 cent   10 rjust   11 full just
  498.  
  499. ; return       0 Return pressed   5 Click off tablet   10 Bad fixed offset
  500. ; codes in     1 Esc pressed      6 Menu select        11 Can't attach font
  501. ; D0           2 No print         7 Unrec keyboard     12 Window resized
  502. ;              3 No cursor        8 Window too narrow  13 Window close
  503. ; (8-11 EQ)    4 Contin line      9 Window too shallow 14 Window inact
  504.  
  505. ; on return:   all regs saved except return code in D0
  506. ;              xxp_chnd as above                 } But see exception
  507. ;              xxp_valu has value if task = 3/4  } below
  508. ;              xxp_crsr has cursor (if any)
  509. ;              xxp_kybd has last keyboard entry (if any)
  510. ;              xxp_FWork     has text   (cont if any in xxp_FWork+512)
  511. ;              xxp_FWork+256 has styl   (cont if any in xxp_FWork+768)
  512.  
  513. ; exception    xxp_valu   = chrs in text
  514. ; to above     xxp_valu+2 = text width in pixels (see caution below)
  515. ; for nprt     xxp_chnd   = lhs of crsr (if any)
  516. ;              xxp_chnd+2 = rhs of crsr (if any)
  517.  
  518. ;** caution: text with crsr can have different length from without crsr **
  519.  
  520. ;* internal structure of xxp_FWork
  521.  
  522. ;current, previous & original text & styl  (used only if text can change)
  523. .txte: equ 0                    ;text being edited
  524. .styl: equ 256                  ;styl being edited
  525. .rdot: equ 512                  ;redo text
  526. .rdos: equ 768                  ;redo styl
  527. .orgt: equ 1024                 ;orig text
  528. .orgs: equ 1280                 ;orig styl
  529.  
  530. ;tablet dimensions
  531. .tabx: equ 1536                 ;.L tablet xpos
  532. .taby: equ 1540                 ;.L tablet ypos
  533. .tabw: equ 1544                 ;.L tablet width
  534. .tabh: equ 1548                 ;.L tablet height
  535.  
  536. ;text and styl pointers
  537. .txip: equ 1552                 ;.L text address (= .text if dynamic)
  538. .stip: equ 1556                 ;.L styl address (= .styl if dynamic)
  539.  
  540. ;sundry data
  541. .ulin: equ 1560                 ;.W font underline ypos
  542. .mxjs: equ 1562                 ;.W max fjust quotient
  543. .tbmx: equ 1564                 ;.W max tab width (or max possible if 0)
  544. .comp: equ 1566                 ;.W complement line if -1 else 0
  545. .task: equ 1568                 ;.W task number
  546. .offs: equ 1570                 ;.W operative offset
  547. .offf: equ 1572                 ;.W -1 if offset fixed
  548. .forb: equ 1574                 ;.W forbid bits
  549. .ltyp: equ 1576                 ;.W current ltyp
  550. .crsr: equ 1578                 ;.W cursor posn or -1 if none
  551. .maxc: equ 1580                 ;.W max characters per line
  552. .maxw: equ 1582                 ;.W max line width or 0 if none
  553. .prev: equ 1584                 ;.W pixels in tablet from previous echo
  554. .this: equ 1586                 ;.W pixels in tablet from this echo
  555. .chrs: equ 1588                 ;.W current chrs in line
  556. .wdth: equ 1590                 ;.W current line width
  557. .cslf: equ 1592                 ;.W current crsr lhs
  558. .csrt: equ 1594                 ;.W current crsr rhs
  559. .font: equ 1596                 ;.W font number
  560. .ftyp: equ 1598                 ;.W current font style
  561. .cspc: equ 1600                 ;.W initial character spacing
  562. .clr0: equ 1602                 ;.W cache of window pens
  563. .csrc: equ 1604                 ;.W chr under cursor (0 if space appended)
  564. .rdcs: equ 1606                 ;.W redo crsr posn
  565. .ogcs: equ 1608                 ;.W orig crsr posn
  566. .ljsr: equ 1610                 ;.W ljust remainder
  567. .kybd: equ 1612                 ;.W crsr xpos in pixels, if 0 use xxp_xcrsr
  568. .nprt: equ 1614                 ;.W don't print if -1 else 0
  569. .iclr: equ 1616                 ;.W clear tablet initially if -1 else 0
  570. .toff: equ 1618                 ;.W text offset set by .totl
  571. .ftvl: equ 1620                 ;.L font pointer
  572. .fty2: equ 1624                 ;.W current font style for xxp_WPort
  573. .minx: equ 1626                 ;.W minx from TextExtent
  574. .tral: equ 1628                 ;.W strip trailing spaces if -1 else 0
  575. .rdch: equ 1630                 ;.L redo xxp_chnd
  576. .ogch: equ 1634                 ;.L orig xxp_chnd
  577. .rdty: equ 1638                 ;.W redo .ltyp
  578. .ogty: equ 1640                 ;.W orig .ltyp
  579. .rdcp: equ 1642                 ;.W redo .comp
  580. .ogcp: equ 1644                 ;.W orig .comp
  581. .code: equ 1646                 ;.W return code
  582. .same: equ 1648                 ;(unused)
  583. .ina4: equ 1650                 ;.W -1 if xxp_xtext was A4
  584. .cura: equ 1652                 ;.L .stip crsr addr (used by .fore)
  585. .bmpa: equ 1656                 ;.L .stip jbump addr (used by .fore)
  586. .shad: equ 1660                 ;.L xxp_xshdv data: 0,pen,dy,dx
  587. .resz: equ 1664                 ;.W -1 if can resize window
  588. .menu: equ 1666                 ;.W menu number of LineFormat menu, else -2
  589. .ifix: equ 1668                 ;.W -1 if input font proportional
  590. .ifxv: equ 1670                 ;.W XSize to force upon prop -> fixed
  591. .ifof: equ 1672                 ;.W .ifix amt bumped by latest .fore call
  592. .styb: equ 1674                 ;.W 0, or xxp_xstyb input
  593. .jam1: equ 1676                 ;.W 0, or -1 if jam1
  594. .case: equ 1678                 ;.W case: 0normal, 1ucase 2lcase 3smallcaps
  595. .revs: equ 1680                 ;.W reverse: 0normal, -1right to left
  596.  
  597. ;a partial xxp_wsuw for rendering (xxp_WPort+4 bytes)
  598. .wsuw: equ 1684                 ;part xxp_wsuw for ERport
  599.  
  600. .limt: equ .wsuw+44             ;limit of xxp_FWork data (s/be <= 1800)
  601.  
  602.  
  603. ;*** TLReqedit - save properties of calling window (restored at end)
  604.  
  605.  movem.l d0-d7/a0-a6,-(a7)      ;saves all except return code in D0
  606.  move.l xxp_strg(a4),-(a7)
  607.  move.l xxp_Help(a4),-(a7)
  608.  move.l xxp_AcWind(a4),a5       ;* a5 = active window } Throughout
  609.  move.l xxp_FWork(a4),a6        ;* a6 = xxp_FWork     } TLreqedit
  610.  move.l xxp_FrontPen(a5),-(a7)
  611.  move.l xxp_IText(a5),-(a7)
  612.  move.w #-1,xxp_Attc(a5)
  613.  move.l xxp_Fnum(a5),-(a7)
  614.  move.l xxp_Fsty(a5),-(a7)
  615.  
  616.  
  617. ;*** TLReqedit - input d0,d1 to .tabx,.taby
  618.  
  619.  clr.l .tabx(a6)           ;input d0,d1 to .tabx, .taby
  620.  move.w d0,.tabx+2(a6)
  621.  clr.l .taby(a6)
  622.  move.w d1,.taby+2(a6)
  623.  
  624.  
  625. ;*** TLReqedit - process tags
  626.  
  627.  move.l a6,a1              ;clear .tabw -> .limt
  628.  add.w #.tabw,a1
  629.  move.w #.limt-.tabw-1,d2
  630. .tag0:
  631.  clr.b (a1)+               ;clear data area of FWork
  632.  dbra d2,.tag0
  633.  
  634.  move.w #5,.mxjs(a6)       ;set defaults (all other defaults = 0)
  635.  move.w #254,.maxc(a6)
  636.  move.w #-1,.tral(a6)
  637.  move.w xxp_Fnum(a5),.font(a6)
  638.  move.w xxp_Tspc(a5),.cspc(a6)
  639.  move.w xxp_FrontPen(a5),.clr0(a6)
  640.  move.l xxp_shad(a5),.shad(a6)
  641.  move.w #-1,.forb(a6)
  642.  move.l a4,.txip(a6)
  643.  move.w #-2,.menu(a6)
  644.  
  645.  clr.l xxp_chnd(a4)        ;initialise xxp_chnd (tags will update)
  646.  
  647. .tags:                     ;* collect tags...
  648.  move.l (a0)+,d2           ;d2 = tag num
  649.  beq .ntag                 ;go if tags all got
  650.  move.l (a0)+,d3           ;d3 = tag data
  651.  subq.w #2,d2              ;go to whichever tag
  652.  bcs .xtex
  653.  beq .xsty
  654.  subq.w #2,d2
  655.  bcs .xmxt
  656.  beq .xmxc
  657.  subq.w #2,d2
  658.  bcs .xmxw
  659.  beq .xcrs
  660.  subq.w #2,d2
  661.  bcs .xofs
  662.  beq .xfor
  663.  subq.w #2,d2
  664.  bcs .xtsk
  665.  beq .xcmp
  666.  subq.w #2,d2
  667.  bcs .xnpr
  668.  beq .xfon
  669.  subq.w #2,d2
  670.  bcs .xcsp
  671.  beq .xmxj
  672.  subq.w #2,d2
  673.  bcs .xlty
  674.  beq .xkbd
  675.  subq.w #2,d2
  676.  bcs .tags                 ;(17 unused)
  677.  beq .xclr
  678.  subq.w #2,d2
  679.  bcs .xtrl
  680.  beq .xshd
  681.  subq.w #2,d2
  682.  bcs .xrsz
  683.  beq .xmen
  684.  subq.w #2,d2
  685.  bcs .xpns
  686.  beq .xfix
  687.  subq.w #2,d2
  688.  bcs .xjam
  689.  beq .xcas
  690.  subq.w #2,d2
  691.  bcs .xstb
  692.  beq .xrvs
  693.  bra .tags
  694.  
  695. .xtex:                     ;replace FWork defaults with tag data
  696.  move.l d3,.txip(a6)
  697.  bra .tags
  698. .xsty:
  699.  move.l d3,.stip(a6)
  700.  bra .tags
  701. .xmxt:
  702.  move.w d3,.tbmx(a6)
  703.  bra .tags
  704. .xmxc:
  705.  move.w d3,.maxc(a6)
  706.  bra .tags
  707. .xmxw:
  708.  move.w d3,.maxw(a6)
  709.  bra .tags
  710. .xcrs:
  711.  move.w d3,.crsr(a6)
  712.  bpl .tags
  713.  move.w #3,.code(a6)       ;if tagged no crsr, return code = 3
  714.  bra .tags
  715. .xofs:
  716.  clr.w .offf(a6)           ;no fixed if d3 = -1
  717.  clr.w .offs(a6)
  718.  tst.w d3
  719.  bmi .tags
  720.  subq.w #1,.offf(a6)       ;else, offset is fixed
  721.  move.w d3,.offs(a6)
  722.  bra .tags
  723. .xfor:
  724.  move.w d3,.forb(a6)
  725.  bra .tags
  726. .xtsk:
  727.  move.w d3,.task(a6)
  728.  bra .tags
  729. .xcmp:
  730.  move.w d3,.comp(a6)
  731.  bpl .tags
  732.  bset #5,xxp_chnd+2(a4)    ;xxp_chnd bit 13 if comp
  733.  bra .tags
  734. .xnpr:
  735.  move.w d3,.nprt(a6)
  736.  bra .tags
  737. .xfon:
  738.  move.w d3,.font(a6)
  739.  bra .tags
  740. .xcsp:
  741.  move.w d3,.cspc(a6)
  742.  bra .tags
  743. .xmxj:
  744.  move.w d3,.mxjs(a6)
  745.  bra .tags
  746. .xlty:
  747.  move.w d3,.ltyp(a6)
  748.  and.b #$FC,xxp_chnd+2(a4)
  749.  or.b d3,xxp_chnd+2(a4)    ;note ltyp in xxp_chnd
  750.  bra .tags
  751. .xkbd:
  752.  move.w d3,.kybd(a6)
  753.  bra .tags
  754. .xclr:
  755.  move.w d3,.iclr(a6)
  756.  bra .tags
  757. .xtrl:
  758.  move.w d3,.tral(a6)
  759.  bra .tags
  760. .xshd:
  761.  move.l d3,.shad(a6)
  762.  bra .tags
  763. .xrsz:
  764.  move.w d3,.resz(a6)
  765.  bra .tags
  766. .xmen:
  767.  move.w d3,.menu(a6)
  768.  bra .tags
  769. .xpns:
  770.  move.w d3,.clr0(a6)
  771.  bra .tags
  772. .xfix:
  773.  move.w d3,.ifix(a6)
  774.  bpl .tags
  775.  bset #3,xxp_chnd+2(a4)
  776.  bra .tags
  777. .xjam:
  778.  move.w d3,.jam1(a6)
  779.  bra .tags
  780. .xcas:
  781.  move.w d3,.case(a6)
  782.  bra .tags
  783. .xstb:
  784.  move.w d3,.styb(a6)
  785.  bra .tags
  786. .xrvs:
  787.  move.w d3,.revs(a6)
  788.  bra .tags
  789.  
  790.  
  791. ;*** TLReqedit - other setting up ***
  792.  
  793. ;exit to         .dm00      continue
  794. ;                .dm03      comtinue (nprt)
  795. ;                .badf      can't attach font
  796. ;internal bsr's   none
  797.  
  798. .ntag:                     ;tags all done
  799.  
  800.  cmp.l .txip(a6),a4        ;set .ina4 if input text is in a4
  801.  bne.s .nta4
  802.  subq.w #1,.ina4(a6)
  803.  
  804. .nta4:                     ;set up redo things if applicable
  805.  tst.l .txip(a6)           ;set .txip, .stip
  806.  bne.s .txig
  807.  move.l a6,.txip(a6)       ;if no txip, assume FWork
  808.  bra.s .txgt
  809.  
  810. .txig:                     ;see if stip to be tfr'ed to FWork
  811.  tst.w .revs(a6)
  812.  bmi.s .txty               ;yes if reversed
  813.  tst.w .case(a6)
  814.  bne.s .txty               ;yes if .case<>0
  815.  tst.w .crsr(a6)
  816.  bmi.s .txgt               ;no if no crsr
  817.  tst.w .nprt(a6)
  818.  bmi.s .txgt               ;no if nprt
  819.  cmp.l .txip(a6),a6
  820.  beq.s .txgt               ;no if already at FWork
  821.  
  822. .txty:
  823.  move.l .txip(a6),a0       ;tfr text to FWork
  824.  move.l a6,.txip(a6)       ;note new .txip
  825.  move.l a6,a1
  826. .txtf:
  827.  move.b (a0)+,(a1)+        ;tfr text to FWork
  828.  bne .txtf
  829.  
  830. .txgt:
  831.  move.l a6,a3              ;a3 = FWork+256 = where styl goes (if changeable)
  832.  add.w #256,a3
  833.  tst.l .stip(a6)           ;.stip specified?
  834.  bne.s .stig               ;yes, go
  835.  
  836.  move.l a3,.stip(a6)       ;fill styl with 0 or as per xxp_xstyb
  837.  move.l .txip(a6),a0       ;(as many bytes as text bytes + 1)
  838.  move.b .styb+1(a6),d0
  839. .st00:
  840.  move.b d0,(a3)+
  841.  tst.b (a0)+
  842.  bne .st00
  843.  bra.s .stgt
  844.  
  845. .stig:                     ;see if tfr sty to FWork+256
  846.  tst.w .revs(a6)
  847.  bmi.s .stty               ;yes if reversed
  848.  cmpi.w #3,.case(a6)
  849.  bne.s .stty               ;yes if .case<>3 (small caps)
  850.  tst.w .crsr(a6)
  851.  bmi.s .stgt               ;not if no crsr
  852.  tst.w .nprt(a6)
  853.  bmi.s .stgt               ;not if nprt
  854.  cmp.l .stip(a6),a3
  855.  beq.s .stgt               ;not if already at FWork+256
  856.  
  857. .stty:                     ;tfr sty to FWork+256
  858.  move.l .stip(a6),a0
  859.  move.l .txip(a6),a1
  860.  move.l a3,.stip(a6)       ;note new .stip
  861. .sttf:
  862.  move.b (a0)+,(a3)+        ;tfr input styl to FWork+256
  863.  tst.b (a1)+               ;(as many bytes as text bytes + 1)
  864.  bne .sttf
  865.  
  866. .stgt:                     ;see if save input data in .orig
  867.  tst.w .crsr(a6)
  868.  bmi.s .help               ;no if no crsr
  869.  tst.w .nprt(a6)
  870.  bmi.s .help               ;no if nprt
  871.  
  872.  move.l .txip(a6),a0       ;save input data in .orig
  873.  move.l .stip(a6),a1
  874.  move.l a6,a2
  875.  add.w #.orgt,a2
  876.  move.l a6,a3
  877.  add.w #.orgs,a3
  878. .ortf:
  879.  move.b (a1),512(a1)
  880.  move.b (a1)+,(a3)+        ;.stip to .orgs
  881.  move.b (a0),512(a0)
  882.  move.b (a0)+,(a2)+        ;.txip to .orgt
  883.  bne .ortf
  884.  
  885.  move.w .crsr(a6),.ogcs(a6) ;set other .orig data
  886.  move.w .crsr(a6),.rdcs(a6)
  887.  move.w .ltyp(a6),.ogty(a6)
  888.  move.w .ltyp(a6),.rdty(a6)
  889.  move.w .comp(a6),.ogcp(a6)
  890.  move.w .comp(a6),.rdcp(a6)
  891.  move.l xxp_chnd(a4),.ogch(a6)
  892.  move.l xxp_chnd(a4),.rdch(a6)
  893.  
  894. .help:                     ;attach default help if none already
  895.  tst.l xxp_Help(a4)
  896.  bne.s .icas
  897.  move.l #.str,xxp_strg(a4)
  898.  move.l #$00010012,xxp_Help(a4)
  899.  
  900. .icas:
  901.  tst.w .case(a6)           ;go if no xxp_xcase
  902.  beq.s .data
  903.  move.l .txip(a6),a0
  904.  
  905.  cmp.w #2,.case(a6)
  906.  bcs.s .ucas               ;go if ucase
  907.  beq.s .lcas               ;go if lcase
  908.  
  909.  move.l .stip(a6),a1       ;here if small caps
  910. .scap:
  911.  move.b (a0)+,d0           ;get next chr,styl
  912.  beq.s .data
  913.  move.b (a1)+,d1
  914.  cmp.b #'a',d0             ;go unless a-z
  915.  bcs .scap
  916.  cmp.b #'z'+1,d0
  917.  bcc .scap
  918.  add.b #'A'-'a',d0
  919.  move.b d0,-1(a0)          ;a-z -> A-Z
  920.  and.b #$C3,d1
  921.  or.b #$10,d1
  922.  move.b d1,-1(a1)          ;make subscript
  923.  bra .scap
  924.  
  925. .ucas:                     ;here if ucase
  926.  move.b (a0)+,d0
  927.  beq.s .data
  928.  cmp.b #'a',d0
  929.  bcs .ucas
  930.  cmp.b #'z'+1,d0
  931.  bcc .ucas
  932.  add.b #'A'-'a',d0
  933.  move.b d0,-1(a0)
  934.  bra .ucas
  935.  
  936. .lcas:                     ;here if lcase
  937.  move.b (a0)+,d0
  938.  beq.s .data
  939.  cmp.b #'A',d0
  940.  bcs .lcas
  941.  cmp.b #'Z'+1,d0
  942.  bcc .lcas
  943.  add.b #'a'-'A',d0
  944.  move.b d0,-1(a0)
  945.  bra .lcas
  946.  
  947. .data:                     ;initialise other data
  948.  move.w .ltyp(a6),d0
  949.  and.w #3,d0               ;initial ltyp to bits 8-9 of xxh_chnd
  950.  or.b d0,xxp_chnd+2(a4)
  951.  clr.w xxp_crsr(a4)
  952.  move.w .crsr(a6),xxp_crsr+2(a4)
  953.  
  954.  move.w .font(a6),d0       ;set font...
  955.  moveq #0,d1
  956.  moveq #0,d2
  957.  bsr TLNewfont             ;attach font to window
  958.  beq .badf                 ;bad if can't
  959.  
  960.  move.w .ifix(a6),d1       ;d1 = ifix requested by tags
  961.  clr.w .ifix(a6)           ;will leave ifix = 0 if font fixed already
  962.  move.l xxp_FSuite(a4),a3
  963.  move.w xxp_Fnum(a5),d2
  964.  mulu #xxp_fsiz,d2
  965.  move.l xxp_plain(a3,d2.w),a3
  966.  btst #5,tf_Flags(a3)      ;font fixed?
  967.  beq.s .fxtf               ;yes, go
  968.  subq.w #1,.ifix(a6)       ;set ifix = -1, set ifxv
  969.  move.w tf_XSize(a3),.ifxv(a6)
  970.  tst.w d1                  ;did tags want ifix off?
  971.  beq.s .fxtf               ;no, go
  972.  addq.w #2,.ifix(a6)       ;yes, switch ifix on
  973. .fxtf:
  974.  
  975.  move.l a6,a3              ;set up .wsuw
  976.  add.w #.wsuw,a3
  977.  clr.l xxp_LeftEdge(a3)
  978.  move.w xxp_Fnum(a5),xxp_Fnum(a3)
  979.  move.w #-1,xxp_Attc(a3)
  980.  move.l xxp_ERport(a4),xxp_WPort(a3)
  981.  clr.l .tabw(a6)           ;initialise tablet area
  982.  clr.l .tabh(a6)
  983.  bsr TLTvert               ;get font height
  984.  move.w d6,.tabh+2(a6)     ;.tabh, .ulin = font height, baseline
  985.  move.w d7,.ulin(a6)
  986.  
  987.  
  988. ;*** TLReqedit - ready to go to .dims
  989.  
  990.  moveq #0,d7               ;d7 = 0 = 1st time thru
  991.  tst.w .nprt(a6)
  992.  bmi.s .dm03               ;don't check window size if no print
  993.  bra.s .dm00
  994.  
  995.  
  996. ;*** TLreqedit - check tablet size, crsr posn &c ***  (Recycling point)
  997.  
  998. ;entry points:    .dims    not 1st time thru
  999. ;                 .dm00    1st time thru
  1000. ;                 .dm03    1st time thru, and nprt
  1001. ;exits are to:    .echo    all ok
  1002. ;                 .badx    window too narrow
  1003. ;                 .bady    window too shallow
  1004. ;                 .bado    bad offset
  1005. ;                 .trnc    line too long
  1006. ;                 .badr    window resized
  1007. ;internal bsr's   .totl
  1008.  
  1009. .dims:                     ;* here if not 1st time thru
  1010.  moveq #-1,d7              ;d7 = -1 = not 1st time thru
  1011.  
  1012.  bsr TLWCheck              ;window dims ok?
  1013.  beq.s .dmok               ;go if window unchanged
  1014.  bra.s .dm01               ;else, check that resizing allowed
  1015.  
  1016. .dm00:                     ;* here if 1st time thru
  1017.  bsr TLWCheck              ;go if window size same as known to caller
  1018.  beq.s .dm03
  1019.  
  1020. .dm01:                     ;* window has been resized
  1021.  tst.w .resz(a6)           ;is that permitted?
  1022.  beq .badr                 ;no, abort - go to .badr
  1023.  bsr TLWupdate             ;* update window dims
  1024.  
  1025. .dm03:                     ;* do this stuff 1st time thru or window resized
  1026.  move.w .taby+2(a6),d0
  1027.  add.w .tabh+2(a6),d0      ;d0 = tablet bot
  1028.  cmp.w xxp_PHeight(a5),d0  ;printable height >= tablet bot?
  1029.  bgt .bady                 ;no, stop - window too shallow
  1030.  
  1031.  move.w xxp_PWidth(a5),d0  ;d0 = printable width - tablet left
  1032.  sub.w .tabx+2(a6),d0      ;   = max available tablet width
  1033.  ble .badx                 ;stop if window too narrow
  1034.  
  1035.  tst.w .tbmx(a6)
  1036.  beq.s .tbwd               ;go if .tbmx undefined
  1037.  cmp.w .tbmx(a6),d0
  1038.  bcs.s .tbwd               ;go if max available width < max allowable width
  1039.  move.w .tbmx(a6),d0       ;else, d0 = max allowable width
  1040. .tbwd:
  1041.  
  1042.  move.w d0,.tabw+2(a6)     ;set tablet width
  1043.  move.w d0,.prev(a6)       ;force clearing of tablet
  1044.  tst.w d7
  1045.  bne.s .dmok               ;go if not 1st time thru
  1046.  tst.w .iclr(a6)
  1047.  bmi.s .dmok               ;clear initially if xxp_xiclr
  1048.  clr.w .prev(a6)           ;else, don't clear tablet
  1049.  
  1050. .dmok:                     ;* check line width & crsr position, set offset
  1051.  clr.l .cura(a6)           ;switch off .cura, .bmpa
  1052.  clr.l .bmpa(a6)
  1053.  
  1054.  bsr .totl                 ;pre-scan line (without crsr)
  1055.  move.w d7,.wdth(a6)       ;put width in .wdth
  1056.  move.w d5,.chrs(a6)       ;put chrs in .chrs
  1057.  
  1058.  tst.w .maxw(a6)
  1059.  beq.s .cmxc               ;go if .maxw undefined
  1060.  cmp.w .maxw(a6),d7        ;check line length...
  1061.  bgt .trnc                 ;go truncate if total width > .maxw
  1062. .cmxc:
  1063.  cmp.w .maxc(a6),d5
  1064.  bgt .trnc                 ;go truncate if chrs in line > .maxc
  1065.  
  1066.  tst.w .crsr(a6)
  1067.  bpl.s .crsy               ;go if crsr exists
  1068.  tst.w .offf(a6)
  1069.  bmi.s .echo               ;no crsr: go if fixed offset
  1070.  clr.w .offs(a6)           ;else, offset = 0
  1071.  bra.s .echo
  1072.  
  1073. .crsy:
  1074.  cmp.w .crsr(a6),d5        ;check crsr posn...
  1075.  bcc.s .crsf               ;yes, go
  1076.  move.w d5,.crsr(a6)       ;no, fix crsr
  1077.  
  1078. .crsf:                     ;set crsr posn...
  1079.  moveq #0,d0
  1080.  move.w .crsr(a6),d0       ;d0 = crsr tab
  1081.  move.l .stip(a6),a0
  1082.  move.l a0,.cura(a6)       ;cause .fore to isolate the cursor byte
  1083.  add.l d0,.cura(a6)
  1084.  move.l .txip(a6),a1
  1085.  move.b 1(a1,d0.w),.csrc+1(a6)
  1086.  move.b 0(a1,d0.w),.csrc(a6) ;save chr under crsr
  1087.  bne.s .offc               ;go if not eol
  1088.  move.b #$20,0(a1,d0.w)    ;if eol, append a space
  1089.  clr.b 1(a1,d0.w)
  1090.  
  1091. .offc:                     ;check offset...
  1092.  bsr .totl                 ;again pre-scan line, with cursor
  1093.  move.w d7,.wdth(a6)       ;note width with csrs (can be > without)
  1094.  move.w d6,.cslf(a6)       ;note crsr lhs
  1095.  move.w d4,.csrt(a6)       ;note crsr rhs
  1096.  tst.w .nprt(a6)
  1097.  bmi.s .echo               ;no need to check offset if nprt
  1098.  sub.w .tabw+2(a6),d4      ;set d4 = mimimum offset; d6 = maximum offset
  1099.  bcc.s .offt               ;(minimum = crsr rhs - tablet width)
  1100.  moveq #0,d4               ;(maximum = crsr lhs)
  1101.  
  1102. .offt:
  1103.  tst.w .offf(a6)           ;ok if offset not fixed
  1104.  bpl.s .offg
  1105.  cmp.w .offs(a6),d4        ;bad if minimum offset > fixed offset
  1106.  bgt .bado
  1107.  cmp.w .offs(a6),d6        ;bad if maximum offset < fixed offset
  1108.  blt .bado
  1109.  bra.s .echo
  1110. .offg:                     ;set offset...
  1111.  move.w d4,.offs(a6)       ;if offset unfixed, set to minimum
  1112.  
  1113.  
  1114. ;*** TLReqedit - print the text on the tablet ***
  1115.  
  1116. ;exit points     .dims    recycle - window resized
  1117. ;                .exnp    quit if .nprt
  1118. ;internal bsr's  .prpq    .fore   .forp   .preb
  1119. ;                .prcp    .text   .prpv
  1120.  
  1121. .echo:                     ;* echo the text in the tablet
  1122.  tst.w .nprt(a6)
  1123.  bmi .exnp                 ;go if no print
  1124.  
  1125.  bsr .swap                 ;(swap if reverse text)
  1126.  
  1127.  move.l .txip(a6),a0       ;a0 scans text
  1128.  move.l .stip(a6),a1       ;a1 scans styl
  1129.  clr.w .this(a6)
  1130.  moveq #0,d6
  1131.  move.w .ljsr(a6),d6       ;d6 = fjust remainder set by .totl
  1132.  bmi.s .echf               ;go if none
  1133.  move.l a1,.bmpa(a6)       ;set .bmpa
  1134.  add.l d6,.bmpa(a6)
  1135. .echf:
  1136.  move.w .toff(a6),d6       ;d6 = text offset so far (<>0 if centre,rjust)
  1137.  beq.s .prcu               ;go if offset = 0
  1138.  cmp.w .offs(a6),d6
  1139.  ble.s .prcu               ;go if text offset <= tablet offset
  1140.  bsr .prpq                 ;clear text offset on tablet
  1141.  beq .prbd                 ;bad if can't
  1142. .prcu:                     ;* print next segment
  1143.  tst.b (a0)
  1144.  beq .prqt                 ;done if no more segments
  1145.  cmp.l .bmpa(a6),a1        ;full just remainder here?
  1146.  bne.s .prnb               ;no, go
  1147.  subq.w #1,xxp_Tspc(a5)    ;dec Tspc after full just remainder
  1148. .prnb:
  1149.  bsr .fore                 ;set a2,a3 = end of segment, d0 = length
  1150.  cmp.w #xxp_ewiv,d0        ;wider than xxp_EBmap?
  1151.  ble.s .prok               ;no, continue
  1152. .prch:
  1153.  move.l a2,d0              ;yes, take first half of string
  1154.  sub.l a0,d0
  1155.  lsr.l #1,d0
  1156.  sub.l d0,a2
  1157.  sub.l d0,a3
  1158.  bsr .forp                 ;get its len
  1159.  cmp.w #xxp_ewiv,d0
  1160.  bgt .prch                 ;until len <= xxp_EBmap
  1161. .prok:
  1162.  move.w d6,d1              ;d6 = lhs of segment, d1 = rhs of segment
  1163.  add.w d0,d1
  1164.  cmp.w .offs(a6),d1        ;rhs segment < lhs tablet?
  1165.  bcs .prnx                 ;yes, skip to next segment
  1166.  cmp.w .offs(a6),d6        ;lhs segment >= lhs tablet?
  1167.  bcc.s .prpt               ;yes, go
  1168.  move.w .offs(a6),d2
  1169.  add.w .tabw+2(a6),d2      ;d2 = rhs of tablet
  1170.  cmp.w d2,d1               ;rhs segment >= rhs tablet?
  1171.  bcc.s .pral               ;yes, go
  1172.  bsr .preb                 ;lhs seg < lhs tab and rhs seg < rhs tab..
  1173.  move.w .offs(a6),d2       ;print on EBmap
  1174.  sub.w d6,d2               ;copy from: lhs tab - lhs seg
  1175.  moveq #0,d3               ;copy to:   lhs tab
  1176.  move.w d1,d4              ;width:     rhs seg - lhs tab
  1177.  sub.w .offs(a6),d4
  1178.  move.w d4,.this(a6)       ;.this = width copied
  1179.  bsr .prcp                 ;copy
  1180.  beq .prbd                 ;bad if can't
  1181.  bra .prnx                 ;to next segment
  1182. .pral:                     ;* lhs seg < lhs tab and rhs seg >= rhs tab..
  1183.  bsr .preb                 ;print on EBmap
  1184.  move.w .offs(a6),d2
  1185.  sub.w d6,d2               ;copy from: lhs tab - lhs seg
  1186.  move.w .tabx+2(a6),d3     ;copy to:   lhs tab
  1187.  move.w .tabw+2(a6),d4     ;width:     tab width
  1188.  move.w d4,.this(a6)       ;.this = width copied
  1189.  bsr .prcp                 ;copy to tablet
  1190.  beq .prbd                 ;bad if can't
  1191.  bra .prqt                 ;printing done
  1192. .prpt:                     ;* lhs segment >= lhs tablet..
  1193.  move.w .offs(a6),d2
  1194.  add.w .tabw+2(a6),d2      ;d2 = rhs of tablet
  1195.  cmp.w d1,d2               ;rhs tablet >= rhs segment?
  1196.  bcc.s .prsm               ;yes, go
  1197.  bsr .preb                 ;* lhs seg >= lhs tab and rhs seg > rhs tab..
  1198.  moveq #0,d2               ;print on EBmap
  1199.  move.w d6,d3              ;copy from: lhs seg
  1200.  sub.w .offs(a6),d3        ;copy to:   lhs tab - lhs seg
  1201.  move.w .tabw+2(a6),d4     ;width:     rhs tab - lhs seg
  1202.  sub.w d3,d4
  1203.  add.w d4,.this(a6)        ;add width to .this
  1204.  bsr .prcp                 ;copy to tablet
  1205.  beq .prbd                 ;bad if can't
  1206.  bra.s .prqt               ;printing done
  1207. .prsm:                     ;* lhs seg >= lhs tab and rhs seg <= rhs tab..
  1208.  tst.b (a2)
  1209.  bne.s .ntlt
  1210.  tst.w xxp_Tspc(a5)        ;(use EBmap if Tspc at end)
  1211.  bne.s .tilt
  1212. .ntlt:
  1213.  bsr .text                 ;print on tablet to:  lhs seg - lhs tab
  1214.  beq .prbd                 ;try again if can't
  1215.  add.w d0,.this(a6)        ;add width printed to .this
  1216.  bra.s .prnx               ;to next segment
  1217. .tilt:
  1218.  bsr .preb                 ;print to EBmap
  1219.  moveq #0,d2
  1220.  move.l d6,d3
  1221.  sub.w .offs(a6),d3
  1222.  move.l d0,d4
  1223.  bsr .prcp                 ;copy to tablet
  1224.  beq .prbd                 ;try again if can't
  1225.  add.w d0,.this(a6)        ;add width printed to .this
  1226. .prnx:                     ;* to next segment
  1227.  move.w d1,d6              ;d6 = its xpos
  1228.  move.l a2,a0              ;a0 = its text
  1229.  move.l a3,a1              ;a1 = its styl
  1230.  bra .prcu                 ;go see if any & print it
  1231.  
  1232. .prbd:                     ;* printing failed (window resized)
  1233.  bsr .swap                 ;un-swap if reverse
  1234.  move.w .crsr(a6),d0
  1235.  bmi .dims                 ;go if no crsr
  1236.  move.l .txip(a6),a0       ;else, restore chr under crsr
  1237.  move.b .csrc+1(a6),1(a0,d0.w)
  1238.  move.b .csrc(a6),0(a0,d0.w)
  1239.  bra .dims                 ;& retry at new size
  1240.  
  1241. .prqt:                     ;* printed ok
  1242.  move.w .prev(a6),d0       ;.prev > .this?
  1243.  cmp.w .this(a6),d0        ;no, go (no need to clear remainder of .prev)
  1244.  ble.s .ecqt
  1245.  bsr .prpv                 ;clear between .this & .prev
  1246.  beq .prbd                 ;bad if can't - window resized
  1247.  
  1248. .ecqt:                     ;* exit from .echo
  1249.  bsr .swap                 ;un-swap if reverse
  1250.  
  1251.  
  1252.  
  1253. ;*** TLReqedit - wait for user response ***
  1254.  
  1255. ;exits:           recycle back to .dims (via .kill if crsr off & close down)
  1256. ;                .exit
  1257. ;                .totl
  1258.  
  1259. .prgd:
  1260.  move.w .crsr(a6),d0
  1261.  bmi .exit                 ;if no crsr, quit
  1262.  move.l .txip(a6),a0
  1263.  move.b .csrc+1(a6),1(a0,d0.w)
  1264.  move.b .csrc(a6),0(a0,d0.w) ;restore chr under crsr
  1265.  move.w .this(a6),.prev(a6) ;set prev for next echo
  1266.  moveq #0,d1
  1267.  move.w .kybd(a6),d1       ;was xxp_xkybd set?
  1268.  beq.s .wait               ;no, go
  1269.  clr.w .kybd(a6)           ;yes, stop it from being invoked again
  1270.  cmp.w .tabw+2(a6),d1      ;go provided d1 < tablet rhs
  1271.  bcs .clkp                 ;(act as if clicked there)
  1272.  
  1273. .wait:
  1274.  jsr TLWfront
  1275.  bsr TLKeyboard            ;* wait for user response
  1276.  cmp.b #$95,d0             ;go if menu selected undo
  1277.  bne.s .knbu
  1278.  cmp.w .menu(a6),d1        ;(unless no/wrong menu strip)
  1279.  bne.s .knbu
  1280.  cmp.b #5,d2
  1281.  beq .ckil
  1282. .knbu:
  1283.  btst #3,d3                ;go if not ctrl
  1284.  beq.s .kgcu
  1285.  btst #0,d3                ;go if not shift
  1286.  beq.s .kgcu
  1287.  cmp.b #21,d0              ;if shift/ctrl/u (undo), go without backup
  1288.  beq .shct
  1289. .kgcu:
  1290.  move.l xxp_FWork(a4),a0   ;else backup in case shift/ctrl/u next time
  1291.  move.l a0,a1
  1292.  add.w #256,a1
  1293.  move.l a0,a2
  1294.  add.w #512,a2
  1295.  move.l a0,a3
  1296.  add.w #768,a3
  1297. .kgbu:
  1298.  move.b (a1)+,(a3)+
  1299.  move.b (a0)+,(a2)+
  1300.  bne .kgbu
  1301.  move.w .crsr(a6),.rdcs(a6)
  1302.  move.w .ltyp(a6),.rdty(a6)
  1303.  move.w .comp(a6),.rdcp(a6)
  1304.  move.l xxp_chnd(a4),.rdch(a6)
  1305.  cmp.b #$95,d0             ;menu selection
  1306.  beq .mens
  1307.  btst #3,d3                ;ctrl keys
  1308.  bne .ctrl
  1309.  btst #6,d3                ;left amiga
  1310.  bne .lfam
  1311.  btst #7,d3                ;right amiga
  1312.  bne .rtam
  1313.  cmp.b #$0D,d0             ;return
  1314.  beq .teol
  1315.  cmp.b #$1B,d0             ;Esc
  1316.  beq .escp
  1317.  cmp.b #$93,d0             ;Close window
  1318.  beq .clwd
  1319.  cmp.b #$97,d0             ;Inactive window
  1320.  beq .inac
  1321.  cmp.b #$8C,d0             ;tab key
  1322.  beq .tabk
  1323.  
  1324.  tst.w .revs(a6)           ;(if reverse, mirror the arrows keys)
  1325.  beq.s .arrs
  1326.  cmp.b #$91,d0
  1327.  beq .rtar
  1328.  cmp.b #$90,d0
  1329.  beq .lfar
  1330.  
  1331. .arrs:
  1332.  cmp.b #$91,d0             ;left arrow
  1333.  beq .lfar
  1334.  cmp.b #$90,d0             ;right arrow
  1335.  beq .rtar
  1336.  cmp.b #$80,d0             ;left mouse
  1337.  beq .clik
  1338.  cmp.b #$8D,d0             ;del
  1339.  beq .del
  1340.  cmp.b #$8B,d0             ;backspace
  1341.  beq .bs
  1342.  cmp.b #$96,d0             ;size window
  1343.  beq .dims
  1344.  cmp.b #$97,d0             ;active window (ignore)
  1345.  beq .wait
  1346.  cmp.w #160,d0             ;reject, unless an ascii chr
  1347.  bcc.s .asci
  1348.  cmp.w #32,d0
  1349.  bcs .unrc
  1350.  cmp.w #127,d0
  1351.  bcc .unrc
  1352. .asci:                     ;* asci chr pressed
  1353.  cmp.w #2,.task(a6)
  1354.  bcs.s .ascy               ;go unless num/hex
  1355.  cmp.b #'0',d0
  1356.  bcs .wait                 ;reject if < 0
  1357.  cmp.b #'9'+1,d0
  1358.  bcs.s .ascy               ;accept if 0-9
  1359.  cmp.w #2,.task(a6)
  1360.  beq .wait                 ;if num, reject if not 0-9
  1361.  cmp.b #'a',d0
  1362.  bcs.s .asch
  1363.  cmp.b #'g',d0
  1364.  bcc .wait
  1365.  sub.b #'a'-'A',d0         ;convert a-f to A-F
  1366. .asch:
  1367.  cmp.b #'A',d0             ;if hex, accept also A-F
  1368.  bcs .wait
  1369.  cmp.b #'G',d0
  1370.  bcc .wait
  1371. .ascy:
  1372.  bset #7,xxp_chnd(a4)      ;note text changed
  1373.  move.l .txip(a6),a0       ;a0 scans text
  1374.  clr.b 254(a0)             ;(max after insertion 255 chrs)
  1375.  move.l a0,a1
  1376.  add.w .crsr(a6),a1        ;a1 = insertion point
  1377. .asce:
  1378.  tst.b (a0)+               ;find eol
  1379.  bne .asce
  1380.  move.l .stip(a6),a2       ;a2 = corresponding styl byte to a0
  1381.  add.l a0,a2
  1382.  sub.l .txip(a6),a2
  1383. .hole:
  1384.  move.b -1(a2),(a2)        ;shift all text & styl a byte fwd
  1385.  move.b -1(a0),(a0)
  1386.  subq.l #1,a2
  1387.  subq.l #1,a0
  1388.  cmp.l a1,a0               ;until insertion point reached
  1389.  bne .hole
  1390.  move.b d0,(a0)            ;insert character
  1391.  addq.w #1,.crsr(a6)       ;bump crsr
  1392.  bra .dims                 ;& recycle
  1393. .del:                      ;* del pressed
  1394.  bset #7,xxp_chnd(a4)
  1395.  btst #0,d3
  1396.  bne.s .shdl               ;go if shifted
  1397.  move.l .txip(a6),a0
  1398.  add.w .crsr(a6),a0        ;a0 points to crsr text
  1399.  tst.b (a0)
  1400.  beq .wait                 ;ignore if no chr under crsr
  1401.  move.l .stip(a6),a1
  1402.  add.w .crsr(a6),a1        ;a1 points to crsr styl
  1403. .delc:
  1404.  move.b 1(a1),(a1)         ;move a chr back
  1405.  move.b 1(a0),(a0)
  1406.  addq.l #1,a0
  1407.  addq.l #1,a1
  1408.  bne .delc                 ;until eol
  1409.  bra .dims
  1410. .shdl:                     ;* shift/del
  1411.  move.l .txip(a6),a0
  1412.  add.w .crsr(a6),a0
  1413.  clr.b (a0)                ;delete all from crsr chr
  1414.  bra .dims
  1415. .bs:                       ;* backspace pressed
  1416.  bset #7,xxp_chnd(a4)
  1417.  btst #0,d3
  1418.  bne.s .shbs               ;go if shifted
  1419.  subq.w #1,.crsr(a6)
  1420.  bcc .del                  ;backspace, then as del
  1421.  clr.w .crsr(a6)
  1422.  bra .del
  1423. .shbs:                     ;* shift backspace
  1424.  move.l .txip(a6),a0
  1425.  move.l .stip(a6),a1
  1426.  move.l a0,a2
  1427.  add.w .crsr(a6),a2
  1428.  move.l a1,a3
  1429.  add.w .crsr(a6),a3
  1430. .sbsc:
  1431.  move.b (a3)+,(a1)+        ;delete all behind crsr
  1432.  move.b (a2)+,(a0)+
  1433.  bne .sbsc
  1434.  clr.w .crsr(a6)
  1435.  bra .dims
  1436. .teol:                     ;* return pressed
  1437.  clr.w .code(a6)           ;return code = 0
  1438.  cmp.w #1,.task(a6)        ;contin line allowed?
  1439.  bne.s .kill               ;no, go
  1440.  move.w #4,.code(a6)       ;return code = 4
  1441.  bset #7,xxp_chnd(a4)      ;note text changed
  1442.  bset #7,xxp_chnd+2(a4)    ;note contin line exists
  1443.  bset #6,xxp_chnd+2(a4)    ;note crsr in contin line
  1444.  move.w .crsr(a6),d0       ;d0 = old crsr
  1445.  clr.w .crsr(a6)           ;new crsr = 0 in contin line
  1446.  move.l .txip(a6),a0       ;contin text from txip+crsr to FWork+512
  1447.  move.l .stip(a6),a1       ;contin styl from stip+crsr to FWork+768
  1448.  add.w d0,a0
  1449.  add.w d0,a1
  1450.  move.l xxp_FWork(a4),a2
  1451.  move.l a2,a3
  1452.  add.w #512,a2
  1453.  add.w #768,a3
  1454.  move.l a0,d0              ;remember split point
  1455. .teot:
  1456.  move.b (a1)+,(a3)+        ;text to contin line
  1457.  move.b (a0)+,(a2)+        ;styl to contin line
  1458.  bne .teot
  1459.  move.l d0,a0              ;delimit old line
  1460.  clr.b (a0)
  1461.  bra.s .kill
  1462. .clwd:                     ;* close window pressed
  1463.  move.w #13,.code(a6)      ;return code = 13
  1464.  bra.s .kill
  1465. .inac:                     ;* inactive window pressed
  1466.  move.w #14,.code(a6)      ;return code = 14
  1467.  bra.s .kill
  1468.  
  1469. .escp:                     ;* Esc pressed
  1470.  move.w #1,.code(a6)       ;return code = 1
  1471.  
  1472. .kill:                     ;* redo with crsr off, then quit
  1473.  bsr .tidy
  1474.  clr.l xxp_crsr(a4)
  1475.  move.w .crsr(a6),xxp_crsr+2(a4) ;set crsr
  1476.  move.w #-1,.crsr(a6)      ;crsr off to print w'out crsr & quit
  1477.  tst.w .tral(a6)
  1478.  beq .dims                 ;go if not removing trailing spaces
  1479.  move.l .txip(a6),a0       ;remove trailing spaces...
  1480.  move.l a0,a1
  1481. .klc0:
  1482.  tst.b (a1)+               ;find eol
  1483.  bne .klc0
  1484.  subq.l #1,a1              ;a1 moves back from eol
  1485. .klc1:
  1486.  clr.b (a1)                ;delimit where reached
  1487.  cmp.l a1,a0               ;go if line empty
  1488.  beq .dims
  1489.  cmp.b #32,-(a1)           ;trailing space?
  1490.  beq .klc1                 ;yes, chop it
  1491.  bra .dims
  1492.  
  1493. .tabk:                     ;* tab key  ^^^^
  1494.  move.w .crsr(a6),d0
  1495.  and.l #$FFF8,d0
  1496.  addq.w #8,d0              ;d0 to next div by 8 tab
  1497.  
  1498.  move.l d1,-(a7)
  1499.  move.w #253,d1            ;d1 = 253 or max line width - 1 if any
  1500.  tst.w .maxc(a6)
  1501.  beq.s .tklm
  1502.  move.w .maxc(a6),d1
  1503.  subq.w #1,d1
  1504. .tklm:
  1505.  cmp.w d1,d0
  1506.  bls.s .tkpt
  1507.  move.w d1,d0              ;max value of d0 is 254 / max line width
  1508. .tkpt:
  1509.  move.l (a7)+,d1
  1510.  move.w d0,.crsr(a6)       ;set new crsr posn
  1511.  
  1512.  move.l .txip(a6),a0       ;point a0 to eol
  1513.  move.l a0,a1
  1514.  add.w .crsr(a6),a1        ;a1 is where crsr is
  1515. .tkeo:
  1516.  tst.b (a0)+
  1517.  bne .tkeo
  1518.  subq.l #1,a0
  1519.  cmp.l a1,a0               ;ok if a0 >= a1 (eol >= crsr)
  1520.  bcc .dims
  1521.  
  1522.  bset #7,xxp_chnd(a4)      ;else insert spaces: note text changed
  1523.  
  1524.  move.l .stip(a6),a2       ;point a2 to corresponding stip to a0
  1525.  add.l a0,a2
  1526.  sub.l .txip(a6),a2
  1527.  move.b (a2),d0            ;d0 = styl to copy forward
  1528. .tksp:
  1529.  move.b d0,(a2)+           ;copy styl forward, append a space
  1530.  move.b #' ',(a0)+
  1531.  cmp.l a1,a0               ;are we at new tab posn yet?
  1532.  bcs .tksp                 ;no, keep inserting
  1533.  clr.b (a0)                ;yes, delimit line there
  1534.  bra .dims
  1535.  
  1536. .lfar:                     ;* left arrow
  1537.  btst #0,d3
  1538.  bne.s .shla               ;go if shift
  1539.  subq.w #1,.crsr(a6)
  1540.  bcc .dims
  1541. .shla:
  1542.  clr.w .crsr(a6)
  1543.  bra .dims
  1544. .rtar:                     ;* right arrow
  1545.  btst #0,d3
  1546.  bne.s .shra               ;go if shift
  1547.  addq.w #1,.crsr(a6)
  1548.  bra .dims
  1549. .shra:
  1550.  move.w #$7FFF,.crsr(a6)
  1551.  bra .dims
  1552. .ctrl:                     ;* ctrl keys
  1553.  btst #0,d3
  1554.  bne .shct                 ;go if shifted
  1555.  cmp.b #2,d0
  1556.  beq .cbol                 ;ctrl/b -> bold
  1557.  cmp.b #3,d0
  1558.  beq .ccnt                 ;ctrl/c -> cent
  1559.  cmp.b #5,d0
  1560.  beq .cun2                 ;ctrl/e -> overline
  1561.  cmp.b #6,d0
  1562.  beq .cun3                 ;ctrl/f -> under + over line
  1563.  cmp.b #7,d0
  1564.  beq .cun4                 ;ctrl/g -> double underline
  1565.  cmp.b #8,d0
  1566.  beq .cun5                 ;ctrl/h -> overline + double underline
  1567.  cmp.b #9,d0
  1568.  beq .citl                 ;ctrl/i -> ital
  1569.  cmp.b #10,d0
  1570.  beq .cfjs                 ;ctrl/j -> fjust
  1571.  cmp.b #12,d0
  1572.  beq .cljs                 ;ctrl/l -> ljust
  1573.  cmp.b #15,d0
  1574.  beq .cout                 ;ctrl/o -> dotted underline
  1575.  cmp.b #16,d0
  1576.  beq .fixt                 ;crtl/p -> fix font
  1577.  cmp.b #18,d0
  1578.  beq .crjs                 ;ctrl/r -> rjust
  1579.  cmp.b #19,d0
  1580.  beq .cshd                 ;ctrl/s -> shadow colr
  1581.  cmp.b #21,d0
  1582.  beq .cund                 ;ctrl/u -> underline
  1583.  cmp.b #22,d0
  1584.  beq .thru                 ;ctrl/v -> strike thru
  1585.  cmp.b #23,d0
  1586.  beq .cwid                 ;ctrl/w -> wide
  1587.  cmp.b #24,d0
  1588.  beq .cxxx                 ;ctrl/x -> x out
  1589.  cmp.b #$8E,d0
  1590.  beq .csup                 ;ctrl/up -> superscript
  1591.  cmp.b #$8F,d0
  1592.  beq .csub                 ;ctrl/dn -> subscript
  1593.  bra .unre
  1594.  
  1595. .shct:                     ;* shift / Ctrl here
  1596.  cmp.b #3,d0
  1597.  beq .ccl4                 ;shift/ctrl/c -> complement
  1598.  cmp.b #18,d0
  1599.  beq .crst                 ;shift/ctrl/r -> restore
  1600.  cmp.b #19,d0
  1601.  beq .cspf                 ;shift/ctrl/s -> space fill
  1602.  cmp.b #21,d0
  1603.  beq .ckil                 ;shift/ctrl/u -> undo
  1604.  bra .unre
  1605. .ccl4:                     ;comp on/off
  1606.  btst #2,.forb(a6)
  1607.  bne .beep                 ;go if forbidden
  1608.  bset #7,xxp_chnd(a4)
  1609.  eori.w #-1,.comp(a6)      ;switch .comp
  1610.  bchg #5,xxp_chnd+2(a4)
  1611.  bra .dims
  1612. .cbol:                     ;bold
  1613.  btst #0,.forb+1(a6)
  1614.  bne .beep                 ;go if forbidden
  1615.  moveq #0,d0               ;else, swap bit 0
  1616.  bra .cwdp
  1617. .ccnt:                     ;centre
  1618.  btst #0,.forb(a6)
  1619.  bne .beep                 ;go if forbidden
  1620.  moveq #1,d0               ;.styl = 1
  1621.  bra .cjpk
  1622. .citl:                     ;italic
  1623.  btst #1,.forb+1(a6)
  1624.  bne .beep                 ;go if forbidden
  1625.  moveq #1,d0               ;else, swap bit 1
  1626.  bra .cwdp
  1627. .cfjs:                     ;fjust
  1628.  btst #7,.forb+1(a6)
  1629.  bne .beep                 ;bad if forbidden
  1630.  moveq #3,d0               ;.styl = 3
  1631.  bra.s .cjpk
  1632. .ckil:                     ;undo
  1633.  move.l xxp_FWork(a4),a0
  1634.  move.l a0,a1
  1635.  add.w #256,a1
  1636.  move.l a0,a2
  1637.  add.w #512,a2
  1638.  move.l a0,a3
  1639.  add.w #768,a3
  1640.  move.w #255,d1
  1641. .cklc:
  1642.  move.b (a3),d0
  1643.  move.b (a1),(a3)+
  1644.  move.b d0,(a1)+
  1645.  move.b (a2),d0
  1646.  move.b (a0),(a2)+
  1647.  move.b d0,(a0)+
  1648.  dbra d1,.cklc
  1649.  move.w .rdcs(a6),d0
  1650.  move.w .crsr(a6),.rdcs(a6)
  1651.  move.w d0,.crsr(a6)
  1652.  move.w .rdty(a6),d0
  1653.  move.w .ltyp(a6),.rdty(a6)
  1654.  move.w d0,.ltyp(a6)
  1655.  move.w .rdcp(a6),d0
  1656.  move.w .comp(a6),.rdcp(a6)
  1657.  move.w d0,.comp(a6)
  1658.  move.l .rdch(a6),d0
  1659.  move.l xxp_chnd(a4),.rdch(a6)
  1660.  move.l d0,xxp_chnd(a6)
  1661.  bra .dims
  1662. .cljs:                     ;ljust
  1663.  btst #1,.forb(a6)
  1664.  bne .beep                 ;go if forbidden
  1665.  moveq #0,d0               ;.styl = 0
  1666. .cjpk:
  1667.  bset #7,xxp_chnd(a4)
  1668.  bset #2,xxp_chnd+2(a4)    ;set bit 10 of xxp_chnd ( = ltyp changed)
  1669.  and.b #$FC,xxp_chnd+2(a4)
  1670.  or.b d0,xxp_chnd+2(a4)    ;note new ltyp in xxp_chnd
  1671.  move.w d0,.ltyp(a6)       ;fix .ltyp
  1672.  bra .dims
  1673. .crst:                     ;restore
  1674.  move.l xxp_FWork(a4),a0
  1675.  move.l a0,a1
  1676.  add.w #256,a1
  1677.  move.l a0,a2
  1678.  add.w #1024,a2
  1679.  move.l a0,a3
  1680.  add.w #1280,a3
  1681. .cstc:
  1682.  move.b (a3)+,(a1)+
  1683.  move.b (a2)+,(a0)+
  1684.  bne .cstc
  1685.  move.w .ogcs(a6),.crsr(a6)
  1686.  move.w .ogty(a6),.ltyp(a6)
  1687.  move.w .ogcp(a6),.comp(a6)
  1688.  move.l .ogch(a6),xxp_chnd(a4)
  1689.  bra .dims
  1690. .crjs:                     ;rjust
  1691.  btst #6,.forb+1(a6)
  1692.  bne .beep                 ;go if forbidden
  1693.  moveq #2,d0               ;.styl = 2
  1694.  bra .cjpk
  1695. .cspf:                     ;space fill
  1696.  cmp.b #255,.chrs(a6)
  1697.  beq .dims                 ;don't do if already 255 chrs
  1698.  move.l .txip(a6),a0
  1699.  move.l .stip(a6),a1
  1700.  add.w .crsr(a6),a0        ;a0,a1 = addr of crsr in text,styl
  1701.  add.w .crsr(a6),a1
  1702. .cspt:
  1703.  move.l a0,a2              ;a2,a3 scan fwd
  1704.  move.l a1,a3
  1705. .cspe:
  1706.  addq.l #1,a3              ;find eol
  1707.  tst.b (a2)+
  1708.  bne .cspe
  1709. .csph:
  1710.  move.b -1(a3),(a3)        ;shift fwd back to crsr
  1711.  move.b -1(a2),(a2)
  1712.  subq.l #1,a3
  1713.  subq.l #1,a2
  1714.  cmp.l a0,a2
  1715.  bne .csph
  1716.  move.b #' ',(a2)          ;fill with a space
  1717.  bsr .totl                 ;get text width
  1718.  tst.w .maxw(a6)
  1719.  beq.w .cspw               ;go if no width limit
  1720.  cmp.w .maxw(a6),d7        ;too wide?
  1721.  bgt.s .cspg               ;yes, go
  1722. .cspw:
  1723.  cmp.w .maxc(a6),d5        ;too many chrs?
  1724.  bgt.s .cspg               ;yes, go
  1725.  addq.w #1,.crsr(a6)       ;no, bump crsr
  1726.  bra .cspt                 ;& continue
  1727. .cspg:
  1728.  move.b 1(a3),(a3)         ;remove final space
  1729.  move.b 1(a2),(a2)
  1730.  beq .dims                 ;& recycle
  1731.  addq.l #1,a3
  1732.  addq.l #1,a2
  1733.  bra .cspg
  1734.  
  1735. .cund:                     ;underline
  1736.  btst #2,.forb+1(a6)
  1737.  bne .beep
  1738.  moveq #$04,d0             ;bitmask ..0001..
  1739.  bra .cwd2
  1740.  
  1741. .cun2:                     ;overline
  1742.  btst #2,.forb+1(a6)
  1743.  bne .beep
  1744.  moveq #$0C,d0             ;bitmask ..0011..
  1745.  bra .cwd2
  1746.  
  1747. .cun3:                     ;under + over
  1748.  btst #2,.forb+1(a6)
  1749.  bne .beep
  1750.  moveq #$14,d0             ;bitmask ..0101..
  1751.  bra .cwd2
  1752.  
  1753. .cun4:                     ;dbl under
  1754.  btst #2,.forb+1(a6)
  1755.  bne .beep
  1756.  moveq #$18,d0             ;bitmask ..0110..
  1757.  bra .cwd2
  1758.  
  1759. .cun5:                     ;dbl under + over
  1760.  btst #2,.forb+1(a6)
  1761.  bne .beep
  1762.  moveq #$1C,d0             ;bitmask ..0111..
  1763.  bra .cwd2
  1764.  
  1765. .csup:                     ;superscript
  1766.  btst #3,.forb(a6)
  1767.  bne .beep                 ;go if forbidden
  1768.  moveq #$08,d0             ;bitmask  ..0010..
  1769.  move.l xxp_FSuite(a4),a0
  1770.  move.w .font(a6),d1
  1771.  mulu #xxp_fsiz,d1
  1772.  add.l d1,a0
  1773.  tst.l xxp_ital(a0)        ;check half height exists
  1774.  bne .cwd2
  1775.  move.w .font(a6),d0
  1776.  bsr TLSuper               ;else, create half height
  1777.  beq .beep                 ;bad if can't
  1778.  moveq #$08,d0
  1779.  bra .cwd2
  1780.  
  1781. .csub:                     ;subscript
  1782.  btst #3,.forb(a6)
  1783.  bne .beep                 ;go if forbidden
  1784.  moveq #$10,d0             ;bitmask ..0100..
  1785.  move.l xxp_FSuite(a4),a0
  1786.  move.w .font(a6),d1
  1787.  add.l d1,a0
  1788.  tst.l xxp_ital(a0)        ;check half height exists
  1789.  bne .cwd2
  1790.  move.w .font(a6),d0
  1791.  bsr TLSuper               ;else, create half height
  1792.  beq .beep                 ;bad if can't
  1793.  moveq #$10,d0
  1794.  bra .cwd2
  1795.  
  1796. .cout:                     ;dotted underline
  1797.  btst #2,.forb+1(a6)
  1798.  bne .beep
  1799.  moveq #$20,d0             ;bitmask ..1000..
  1800.  bra .cwd2
  1801.  
  1802. .thru:                     ;strike thru
  1803.  btst #2,.forb+1(a6)
  1804.  bne .beep
  1805.  moveq #$24,d0             ;bitmask ..1001..
  1806.  bra .cwd2
  1807.  
  1808. .cshd:                     ;shadow
  1809.  btst #5,.forb+1(a6)
  1810.  bne .beep                 ;go if forbidden
  1811.  moveq #6,d0               ;else, swap bit 6
  1812.  bra .cwdp
  1813.  
  1814. .cwid:                     ;wide
  1815.  btst #3,.forb+1(a6)
  1816.  bne .beep                 ;go if forbidden
  1817.  moveq #7,d0               ;else, swap bit 7
  1818.  move.l xxp_FSuite(a4),a0
  1819.  move.w .font(a6),d1
  1820.  mulu #xxp_fsiz,d1
  1821.  add.l d1,a0
  1822.  tst.l xxp_bold(a0)        ;check double width exists
  1823.  bne.s .cwdp
  1824.  move.w .font(a6),d0
  1825.  bsr TLWide                ;else, create double width
  1826.  beq .beep                 ;bad if can't
  1827.  moveq #7,d0
  1828.  
  1829. .cwdp:                     ;change styl bitnum d0
  1830.  bset #7,xxp_chnd(a4)      ;note changed
  1831.  move.l .txip(a6),a0
  1832.  add.w .crsr(a6),a0        ;a0 scans text
  1833.  move.l .stip(a6),a1
  1834.  add.w .crsr(a6),a1        ;a1 scans styl
  1835. .cwdd:
  1836.  bchg d0,(a1)+             ;swap next styl bit
  1837.  tst.b (a0)+               ;until eol
  1838.  bne .cwdd
  1839.  bra .dims
  1840.  
  1841. .cwd2:                     ;move und/up/sub forward  d0=bits 2-5
  1842.  bset #7,xxp_chnd(a4)      ;note changed
  1843.  move.l .txip(a6),a0
  1844.  add.w .crsr(a0),a0        ;a0 scans text
  1845.  move.l .stip(a6),a1
  1846.  add.w .crsr(a6),a1        ;a1 scans style
  1847.  move.b (a1),d1
  1848.  and.b #$3C,d1             ;get bits 2-5 of style bit
  1849.  cmp.b d0,d1               ;same as mask?
  1850.  bne.s .cw2d               ;no, use mask
  1851.  moveq #0,d0               ;else, switch bits 2-5 off
  1852. .cw2d:
  1853.  move.b (a1),d1            ;get styl byte
  1854.  and.b #$C3,d1             ;kill bits 2-5
  1855.  or.b d0,d1                ;insert new bits 2-5
  1856.  move.b d1,(a1)+           ;save new styl byte
  1857.  tst.b (a0)+
  1858.  bne .cw2d                 ;until eol
  1859.  bra .dims
  1860.  
  1861. .fixt:                     ;fixed/proportional
  1862.  tst.w  .ifix(a6)
  1863.  beq .wait                 ;go if font always fixed
  1864.  btst #4,.forb+1(a6)
  1865.  bne .beep
  1866.  bset #7,xxp_chnd(a4)
  1867.  tst.w .ifix(a6)
  1868.  bmi.s .fxfx
  1869.  bclr #3,xxp_chnd+2(a4)    ;clear bit 11
  1870.  move.w #-1,.ifix(a6)      ;switch prop(-1)/fixed(+1)
  1871.  bra .dims
  1872. .fxfx:
  1873.  bset #3,xxp_chnd+2(a4)    ;set bit 11
  1874.  move.w #1,.ifix(a6)
  1875.  bra .dims
  1876.  
  1877. .cxxx:                     ;x out
  1878.  bset #7,xxp_chnd(a4)
  1879.  move.l .txip(a6),a0
  1880.  clr.b (a0)
  1881.  bra .dims
  1882.  
  1883. .beep:                     ;here if action forbidden
  1884.  movem.l d0-d1/a0-a1/a6,-(a7)
  1885.  move.l xxp_Screen(a4),a0
  1886.  move.l xxp_intb(a4),a6
  1887.  jsr _LVODisplayBeep(a6)
  1888.  movem.l (a7)+,d0-d1/a0-a1/a6
  1889.  bra .dims
  1890. .mens:                     ;* menu selection
  1891.  cmp.w .menu(a6),d1
  1892.  bne .menn                 ;only if menu = xxp_xmenu
  1893.  tst.w d2
  1894.  bmi .wait
  1895.  beq.s .men1               ; 1 -> font style sub-menu
  1896.  cmp.w #2,d2
  1897.  bcs .men2                 ; 2 -> underline style sub-menu
  1898.  beq .men3
  1899.  cmp.w #4,d2               ; 3 -> justification sub-menu
  1900.  bcs .ccl4                 ; 4 complement
  1901.  beq .cxxx                 ; 5 erase
  1902.  cmp.w #6,d2
  1903.  bcs .ckil                 ; 6 undo
  1904.  beq .crst                 ; 7 restore
  1905.  cmp.w #8,d2
  1906.  bcs .cspf                 ; 8 space-fill
  1907.  bra .wait
  1908. .men1:
  1909.  tst.w d3
  1910.  bmi .wait
  1911.  beq .cbol                 ; 1,1 bold
  1912.  cmp.w #2,d3
  1913.  bcs .citl                 ; 1,2 italic
  1914.  beq .cwid                 ; 1,3 wide
  1915.  cmp.w #4,d3
  1916.  bcs .cshd                 ; 1,4 shadow
  1917.  beq .csup                 ; 1,5 superscript
  1918.  cmp.w #6,d3
  1919.  bcs .csub                 ; 1,6 subscript
  1920.  bra .wait
  1921.  
  1922. .men2:
  1923.  tst.w d3
  1924.  bcs .wait
  1925.  beq .cund                 ; 2,1 single underline
  1926.  cmp.w #2,d3
  1927.  bcs .cun2                 ; 2,2 overline
  1928.  beq .cun3                 ; 2,3 over+underline
  1929.  cmp.w #4,d3
  1930.  bcs .cun4                 ; 2,4 dbl underline
  1931.  beq .cun5                 ; 2,5 double under + overline
  1932.  cmp.w #6,d3
  1933.  bcs .cout                 ; 2,6 dotted underline
  1934.  beq .thru                 ; 2,7 strike thru
  1935.  bra .wait
  1936.  
  1937. .men3:
  1938.  tst.w d3
  1939.  bcs .wait
  1940.  beq .crjs                 ; 3,1 right justify
  1941.  cmp.w #2,d3
  1942.  bcs .cfjs                 ; 3,2 full justify
  1943.  beq .ccnt                 ; 3,3 centre
  1944.  cmp.w #4,d3
  1945.  bcs .cljs                 ; 3,4 left justify
  1946.  beq .fixt                 ; 3,5 force fixed
  1947.  bra .wait
  1948. .menn:
  1949.  btst #4,.forb(a6)
  1950.  bne .wait                 ;ignore if return forbidden
  1951.  move.w #6,.code(a6)       ;return code = 6
  1952.  bra .kill
  1953. .lfam:                     ;* left amiga keys  (all unrecognised)
  1954. .rtam:                     ;* right amiga keys (all unrecognised)
  1955. .unrc:                     ;* unrecognised TLKeyboard (not menu, ctrl)
  1956.  btst #6,.forb(a6)
  1957.  bne .wait                 ;don't return if forbid
  1958.  bra.s .unry               ;else quit
  1959. .unre:
  1960.  btst #5,.forb(a6)         ;don't return if forbid
  1961.  bne .wait
  1962. .unry:
  1963.  move.w #7,.code(a6)       ;return code = 7
  1964.  bra .kill
  1965. .offw:                     ;* clicked off tablet
  1966.  move.w #5,.code(a6)       ;return code = 5
  1967.  bra .kill
  1968. .clik:                     ;* line clicked
  1969.  sub.w xxp_LeftEdge(a5),d1 ;make d1,d2 (coords) rel to printable area
  1970.  bcs .offw                 ;go if off printable area
  1971.  sub.w xxp_TopEdge(a5),d2
  1972.  bcs .offw
  1973.  sub.w .tabx+2(a6),d1      ;make d1,d2 rel to tablet
  1974.  bcs .offw                 ;go if off tablet
  1975.  sub.w .taby+2(a6),d2
  1976.  bcs .offw
  1977.  cmp.w .tabw+2(a6),d1
  1978.  bcc .offw
  1979.  cmp.w .tabh+2(a6),d2
  1980.  bcc .offw
  1981.  
  1982. .clkp:
  1983.  move.w #-1,.crsr(a6)      ;try increasing text width until d1 < crsr rhs
  1984. .clkn:
  1985.  addq.w #1,.crsr(a6)       ;crsr = 0+
  1986.  moveq #0,d0
  1987.  move.w .crsr(a6),d0       ;d0 = proposed crsr
  1988.  cmp.w .chrs(a6),d0        ;crsr >= chrs?
  1989.  bcc .dims                 ;yes, put crsr here
  1990.  move.l .stip(a6),a0       ;a0 = text
  1991.  move.l a0,.cura(a6)       ;set proposed crsr
  1992.  add.l d0,.cura(a6)
  1993.  
  1994.  bsr .swap
  1995.  bsr .totl                 ;get cursor posn (swap if reversed)
  1996.  bsr .swap
  1997.  
  1998.  tst.w .revs(a6)           ;go if not reversed
  1999.  beq.s .clkk
  2000.  
  2001.  cmp.w d6,d1               ;xpos of clik >= lhs crsr?
  2002.  bcs .clkn                 ;no, keep looking
  2003.  bra .dims                 ;yes, put crsr here
  2004.  
  2005. .clkk:
  2006.  cmp.w d4,d1               ;xpos of clik < rhs crsr?
  2007.  bcc .clkn                 ;no, keep looking
  2008.  bra .dims                 ;yes, put crsr here
  2009.  
  2010. ;*** TLReqedit - line too long, & error conditions ***
  2011.  
  2012. ; exits           .dims     recycle
  2013. ;                 .kill     quit (with contin line)
  2014.  
  2015. .trnc:                     ;* truncate line
  2016.  bset #7,xxp_chnd(a4)      ;set bit 31 of chnd = text changed
  2017.  move.l .txip(a6),a0
  2018. .tueo:
  2019.  tst.b (a0)+
  2020.  bne .tueo
  2021.  subq.l #1,a0              ;point a0 to line delimiter
  2022.  cmp.w #1,.task(a6)
  2023.  beq.s .cont               ;go if continuation line
  2024. .chop:
  2025.  clr.b -(a0)               ;remove final chr
  2026.  bra .dims                 ;& try again
  2027. .cont:
  2028.  move.w #4,.code(a6)
  2029.  move.l a0,a1
  2030. .cons:
  2031.  cmp.b #32,-(a1)           ;find last space in text
  2032.  beq.s .cogt
  2033.  cmp.l .txip(a6),a1        ;if no spaces, simply chop last chr
  2034.  bne .cons
  2035.  bra .chop                 ;(truncate if no space found)
  2036. .cogt:
  2037.  move.l a1,a0              ;a0 = space
  2038.  move.l a0,d0
  2039.  sub.l .txip(a6),d0        ;d0 = tab of space
  2040.  move.l .stip(a6),a1
  2041.  add.l d0,a1               ;a1 = styl of space
  2042.  clr.b (a0)+               ;delimit line, point a0 to text after
  2043.  addq.l #1,a1              ;point a1 to styl after
  2044.  moveq #0,d1
  2045.  move.w .crsr(a6),d1       ;d1 = crsr
  2046.  cmp.w d0,d1
  2047.  bcs.s .col1               ;go if crsr on 1st line
  2048.  sub.w d0,d1
  2049.  subq.w #1,d1              ;make crsr rel to 2nd line
  2050.  bcc.s .col2
  2051.  moveq #0,d1
  2052. .col2:
  2053.  bset #6,xxp_chnd+2(a4)    ;set bit 14 on xxp_chnd (=crsr on contin line)
  2054. .col1:
  2055.  move.w d1,.crsr(a6)       ;set crsr
  2056.  move.l a6,a2
  2057.  add.w #.rdot,a2
  2058.  move.l a6,a3
  2059.  add.w #.rdos,a3
  2060. .cotf:
  2061.  move.b (a1)+,(a3)+        ;tfr 2nd line text to FWork+512
  2062.  move.b (a0)+,(a2)+        ;tfr 2nd line styl to FWork+768
  2063.  bne .cotf
  2064.  bset #7,xxp_chnd+2(a4)    ;set bit 15 of xxp_chnd = contin line exists
  2065.  bra .kill
  2066.  
  2067. .exnp:                     ;* exit without printing
  2068.  move.w #2,.code(a6)       ;return code = 2
  2069.  move.w .chrs(a6),xxp_valu(a4)
  2070.  move.w .wdth(a6),xxp_valu+2(a4)
  2071.  move.w .cslf(a6),xxp_chnd(a4)
  2072.  move.w .csrt(a6),xxp_chnd+2(a4)
  2073.  clr.l xxp_crsr(a4)
  2074.  move.w .crsr(a6),xxp_crsr+2(a4)
  2075.  bmi .wrap                 ;go if no crsr
  2076.  
  2077.  move.l .txip(a6),a0       ;restore chr under crsr
  2078.  move.w .crsr(a6),d0
  2079.  move.b .csrc+1(a6),1(a0,d0.w)
  2080.  move.b .csrc(a6),0(a0,d0.w)
  2081.  bra .wrap
  2082.  
  2083. .badr:                     ;* exit: resized & xxp_xresz = 0
  2084.  move.w #12,.code(a6)
  2085.  bra.s .badw
  2086.  
  2087. .bado:                     ;* exit: can't obey fixed offset
  2088.  move.w #10,.code(a6)      ;return code = 10
  2089.  move.w .crsr(a6),d0
  2090.  bmi.s .badw               ;go if no crsr
  2091.  move.l .txip(a6),a0       ;else, restore chr under crsr
  2092.  move.b .csrc+1(a6),1(a0,d0.w)
  2093.  move.b .csrc(a6),0(a0,d0.w)
  2094.  bra.s .badw
  2095.  
  2096. .badx:                     ;* exit: window too narrow
  2097.  move.w #8,.code(a6)       ;return code = 8
  2098.  bra.s .badw
  2099.  
  2100. .bady:                     ;* exit: window too shallow
  2101.  move.w #9,.code(a6)       ;return code = 9
  2102.  bra.s .badw
  2103.  
  2104. .badf:                     ;* exit: can't attach font
  2105.  move.w #11,.code(a6)      ;return code = 11
  2106.  
  2107. .badw:                     ;* wrap up after bad exit
  2108.  bset #4,xxp_chnd+2(a4)    ;set bit 12 of xxp_chnd for retn codes 8-11
  2109.  clr.l xxp_crsr(a4)        ;record final crsr
  2110.  move.w .crsr(a6),xxp_crsr+2(a4)
  2111.  
  2112. *** TLreqedit - close down ***
  2113.  
  2114. ;exits            none
  2115. ;internal bsr's   none
  2116.  
  2117. .exit:                     ;* exit from TLReqedit
  2118.  move.w .offs(a6),d0
  2119.  or.w xxp_chnd(a4),d0
  2120.  move.w d0,xxp_chnd(a4)    ;offset to xxp_chnd bits 16-30
  2121.  cmp.w #3,.task(a6)
  2122.  beq.s .exhx               ;if task = 3, get hex value
  2123.  cmp.w #2,.task(a6)
  2124.  bne.s .wrap               ;if task = 2, get dec value
  2125.  move.l .txip(a6),a0       ;* get decimal value to xxp_valu
  2126.  moveq #0,d0
  2127.  moveq #0,d1
  2128. .exnd:
  2129.  move.b (a0)+,d1
  2130.  sub.b #'0',d1
  2131.  bcs.s .exvl
  2132.  cmp.b #10,d1
  2133.  bcc.s .exvl
  2134.  move.l d0,d2
  2135.  lsl.l #2,d0
  2136.  add.l d2,d0
  2137.  lsl.l #1,d0
  2138.  add.l d1,d0
  2139.  bra .exnd
  2140. .exhx:                     ;* get hex value to xxp_valu
  2141.  move.l .txip(a6),a0
  2142.  moveq #0,d0
  2143.  moveq #0,d1
  2144. .exnh:
  2145.  move.b (a0)+,d1
  2146.  sub.b #'0',d1
  2147.  bcs.s .exvl
  2148.  cmp.b #10,d1
  2149.  bcs.s .excl
  2150.  sub.b #'A'-':',d1
  2151.  cmp.b #16,d1
  2152.  bcc.s .exvl
  2153. .excl:
  2154.  lsl.l #4,d0
  2155.  add.l d1,d0
  2156.  bra .exnh
  2157. .exvl:
  2158.  move.l d0,xxp_valu(a4)
  2159. .wrap:                     ;* embed Ctrl's if required
  2160.  
  2161. .wpcu:
  2162.  tst.w .ina4(a6)           ;* if input was a4, put output to a4
  2163.  beq.s .excu
  2164.  move.l .txip(a6),a0
  2165.  cmp.l a0,a4
  2166.  beq.s .excu
  2167.  move.l a4,a1
  2168. .wptf:
  2169.  move.b (a0)+,(a1)+
  2170.  bne .wptf
  2171.  
  2172. .excu:                     ;* clear stack, exit from TLReqedit
  2173.  move.l (a7)+,xxp_Fsty(a5)
  2174.  move.l (a7)+,xxp_Fnum(a5)
  2175.  move.l (a7)+,xxp_IText(a5)
  2176.  move.l (a7)+,xxp_FrontPen(a5)
  2177.  move.l (a7)+,xxp_Help(a4)
  2178.  move.l (a7)+,xxp_strg(a4)
  2179.  move.w #-1,xxp_Attc(a5)
  2180.  clr.l (a7)
  2181.  move.w .code(a6),2(a7)    ;put return code in stack D0
  2182.  movem.l (a7)+,d0-d7/a0-a6
  2183.  cmp.w #8,d0               ;to .badd if D0 is 8-11 (error condition)
  2184.  bcs.s .good
  2185.  cmp.w #12,d0
  2186.  bcc.s .badd
  2187.  
  2188. .good:
  2189.  tst.l (a7)                ;NE = good (D0 not 8-11)
  2190.  rts
  2191.  
  2192. .badd:
  2193.  cmp.w d0,d0               ;EQ = bad  (D0 8-11)
  2194.  rts
  2195.  
  2196. ;*** TLReqedit - internal subroutines ***
  2197.  
  2198. .preb:                     ;** print segment to EBmap
  2199.  move.l a3,-(a7)
  2200.  move.l a6,a3
  2201.  add.w #.wsuw,a3
  2202.  move.w xxp_Tspc(a5),xxp_Tspc(a3)
  2203.  move.l xxp_xmin(a5),xxp_xmin(a3)
  2204.  move.l a3,a5
  2205.  move.l (a7)+,a3
  2206.  bsr.s .text
  2207.  move.l xxp_AcWind(a4),a5
  2208.  rts
  2209.  
  2210. .text:                     ;** print text
  2211.  
  2212. ;on call:  a0-a2 = text  a1-a3 = styl
  2213. ;          a5 = xxp_AcWind, or part xxp_wsuw with xxp_ERport
  2214. ;          d6 = xpos rel to tablet left (if a5 = AcWind)
  2215. ;          d0 = text width
  2216.  
  2217.  movem.l d0-d3/a0-a3/a6,-(a7) ;save all
  2218.  
  2219.  move.w .clr0(a6),xxp_FrontPen(a5) ;set pens
  2220.  
  2221.  move.b xxp_BackPen(a5),d3 ;remember background pen
  2222.  
  2223.  move.b #RP_JAM2,xxp_DrawMode(a5) ;set draw mode
  2224.  tst.w .jam1(a6)
  2225.  beq.s .txmd
  2226.  move.b #RP_JAM1,xxp_DrawMode(a5) ;(jam1 if xxp_xjam1)
  2227. .txmd:
  2228.  
  2229.  cmp.l .cura(a6),a1         ;if printing crsr, swap pens
  2230.  bne.s .txtc
  2231.  move.b xxp_FrontPen(a5),d0
  2232.  move.b xxp_BackPen(a5),xxp_FrontPen(a5)
  2233.  move.b d0,xxp_BackPen(a5)
  2234. .txtc:
  2235.  
  2236.  tst.w .comp(a6)           ;if complementing line, comp pens
  2237.  bpl.s .txtm
  2238.  eori.w #-1,xxp_FrontPen(a5)
  2239. .txtm:
  2240.  
  2241.  moveq #0,d0               ;set xxp_Fsty
  2242.  move.b (a1),d0
  2243.  move.w d0,xxp_Fsty(a5)
  2244.  
  2245.  move.l a1,a3              ;save styl pointer in a3
  2246.  move.l xxp_WPort(a5),a1   ;a1 = WPort/ERport
  2247.  move.w xxp_Tspc(a5),rp_TxSpacing(a1) ;set TxSpacing
  2248.  bsr TLWfont               ;attach font,pens to rastport if required
  2249.  bsr TLWpens
  2250.  
  2251.  moveq #0,d0               ;* get coords of print posn in rastport
  2252.  moveq #0,d1
  2253.  cmp.l xxp_AcWind(a4),a5   ;at 0,0 if ERport
  2254.  bne.s .move
  2255.  move.w .tabx+2(a6),d0     ;else, at .tabx, .taby
  2256.  add.w d6,d0               ;add xpos within .tabx
  2257.  sub.w .offs(a6),d0        ;sub offset
  2258.  move.w .taby+2(a6),d1
  2259.  add.w xxp_LeftEdge(a5),d0 ;posn rel to printable area of window
  2260.  add.w xxp_TopEdge(a5),d1
  2261. .move:
  2262.  
  2263.  add.w .ulin(a6),d1        ;d1 is posn of underline
  2264.  add.w xxp_xmin(a5),d0     ;add xmin (set by .fore)
  2265.  
  2266.  tst.w .ifix(a6)           ;see if we are forcing fixed width
  2267.  ble.s .nfix
  2268.  tst.w .ifof(a6)           ;go if no bumping of width was required
  2269.  beq.s .nfix
  2270.  
  2271.  tst.w .jam1(a6)           ;go if jam1
  2272.  bne.s .nfix
  2273.  
  2274.  movem.l a0-a1/d0-d4,-(a7) ;clear rhs of fixed width by amt bumped
  2275.  moveq #0,d4               ;d4 = background pen
  2276.  move.b d3,d4              ;d0,d1 = text print posn
  2277.  sub.w .ulin(a6),d1        ;d0,d1 = tablet print posn topleft
  2278.  move.l 28(a7),d2          ;d2 = stack d0 = text segment width
  2279.  move.l .tabh(a6),d3       ;d3 = tablet height
  2280.  bset #29,d0               ;use d4 for pen
  2281.  bsr TLWCheck              ;abort if window resized
  2282.  beq.s .nfxc
  2283.  add.w #28,a7
  2284.  bra .txtb
  2285. .nfxc
  2286.  move.l xxp_WPort(a5),a0
  2287.  bset #31,d1
  2288.  bsr TLReqarea             ;clear area where chr width bumped
  2289.  bsr TLWpens               ;restore pens after TLReqarea
  2290.  movem.l (a7)+,a0-a1/d0-d4
  2291. .nfix:
  2292.  
  2293.  btst #5,(a3)              ;see if super/sub
  2294.  bne .movr
  2295.  btst #2,(a3)              ;not if bit 2 or 5 set
  2296.  bne .movr
  2297.  btst #3,(a3)              ;go if not superscript
  2298.  beq .msbr
  2299.  btst #4,(a3)
  2300.  bne .movr
  2301.  
  2302.  move.l a1,-(a7)           ;* reposn, clear for superscript
  2303.  movem.l a0/d0-d4,-(a7)    ;a1/a0/d0-d4 = 28 bytes added to stack
  2304.  move.l xxp_FSuite(a4),a0
  2305.  move.w .font(a6),d4
  2306.  mulu #xxp_fsiz,d4
  2307.  add.l d4,a0
  2308.  tst.b (a3)                ;go unless super + wide
  2309.  bpl.s .movn
  2310.  move.l xxp_boit(a0),d4    ;get half height + wide font
  2311.  bne.s .movk               ;go if opened, else use unwide
  2312. .movn:
  2313.  move.l xxp_ital(a0),d4    ;get half height font
  2314.  bne.s .movk
  2315.  move.l xxp_plain(a0),d4   ;(or full height if it wasn't opened)
  2316. .movk:
  2317.  move.l d4,a1              ;a1 = half height font
  2318.  
  2319.  tst.w .jam1(a6)           ;go if jam1 (don't clear superscript area)
  2320.  bne.s .mvcc
  2321.  
  2322.  moveq #0,d4
  2323.  move.b d3,d4              ;d4 = background pen
  2324.  move.l (a7),d0            ;get stack print posns
  2325.  move.l 4(a7),d1
  2326.  sub.w .ulin(a6),d1        ;d0,d1 = print posn topleft
  2327.  move.l 28(a7),d2          ;d2 = stack d0 = text segment width
  2328.  move.l .tabh(a6),d3       ;d3 = text height
  2329.  bset #29,d0
  2330.  move.l xxp_WPort(a5),a0
  2331.  bset #31,d1
  2332.  bsr TLWCheck              ;abort if window resized
  2333.  beq.s .movc
  2334.  add.w #28,a7
  2335.  bra .txtb
  2336. .movc
  2337.  bsr TLReqarea             ;clear area where superscript printed
  2338.  bsr TLWpens               ;restore pen after TLReqarea
  2339.  
  2340. .mvcc:
  2341.  movem.l (a7)+,a0/d0-d4
  2342.  sub.w .ulin(a6),d1        ;sub full height baseline
  2343.  add.w tf_Baseline(a1),d1  ;add half height baseline
  2344.  move.l (a7)+,a1
  2345.  bra .movr
  2346.  
  2347. .msbr:
  2348.  btst #4,(a3)              ;go unless subscript
  2349.  beq .movr
  2350.  
  2351.  move.l a1,-(a7)           ;* reposn, clear for subscript
  2352.  movem.l a0/d0-d4,-(a7)    ;a1/a0/d0-d4 = 28 bytes added to stack
  2353.  move.l xxp_FSuite(a4),a0
  2354.  move.w .font(a6),d4
  2355.  mulu #xxp_fsiz,d4
  2356.  add.l d4,a0
  2357.  tst.b (a3)                ;go unless sub + wide
  2358.  bpl.s .msbn
  2359.  move.l xxp_boit(a0),d4    ;get half height + wide font
  2360.  bne.s .msbk               ;go if opened, else use unwide
  2361. .msbn:
  2362.  move.l xxp_ital(a0),d4    ;get half height font
  2363.  bne.s .msbk
  2364.  move.l xxp_plain(a0),d4   ;(or full height if it wasn't opened)
  2365. .msbk:
  2366.  move.l d4,a1              ;a1 = half height font
  2367.  
  2368.  tst.w .jam1(a6)           ;go if jam1 (don't clear subscript area)
  2369.  bne.s .mscc
  2370.  
  2371.  moveq #0,d4
  2372.  move.b d3,d4              ;d4 = background pen
  2373.  move.l (a7),d0            ;get stack print posns
  2374.  move.l 4(a7),d1
  2375.  sub.w .ulin(a6),d1        ;d0,d1 = print posn topleft
  2376.  move.l 28(a7),d2          ;d2 = stack d0 = text segment width
  2377.  move.l .tabh(a6),d3       ;d3 = text height
  2378.  bset #29,d0
  2379.  move.l xxp_WPort(a5),a0
  2380.  bset #31,d1
  2381.  bsr TLWCheck              ;abort if window resized
  2382.  beq.s .msbc
  2383.  add.w #28,a7
  2384.  bra .txtb
  2385. .msbc
  2386.  bsr TLReqarea             ;clear area where subscript printed
  2387.  bsr TLWpens               ;restore pen after TLReqarea
  2388.  
  2389. .mscc:
  2390.  movem.l (a7)+,a0/d0-d4
  2391.  cmp.w #3,.case(a6)        ;keep baseline if small caps
  2392.  beq.s .yscp
  2393.  sub.w .ulin(a6),d1        ;sub full height baseline
  2394.  add.l .tabh(a6),d1        ;to bottom of tablet
  2395.  sub.w tf_YSize(a1),d1     ;to top of half height text
  2396.  add.w tf_Baseline(a1),d1  ;add half height baseline
  2397. .yscp:
  2398.  move.l (a7)+,a1
  2399.  
  2400. .movr:                     ;* move rastport print posn
  2401.  move.l xxp_gfxb(a4),a6
  2402.  move.l d0,d2              ;d2 = xpos printed at
  2403.  movem.l d1/a0-a1,-(a7)
  2404.  jsr _LVOMove(a6)
  2405.  movem.l (a7)+,d1/a0-a1
  2406.  move.l a2,d0
  2407.  sub.l a0,d0               ;d0 = no. of chrs
  2408.  
  2409.  btst #6,(a3)              ;go if not shadow print
  2410.  beq .txdo
  2411.  
  2412.  move.l xxp_FrontPen(a5),-(a7) ;* shadow print
  2413.  movem.l d0-d5/a0-a1,-(a7)
  2414.  move.l xxp_FWork(a4),a6
  2415.  move.b .shad+1(a6),xxp_FrontPen(a5) ;front pen for shadow
  2416.  move.l xxp_gfxb(a4),a6
  2417.  bsr TLWpens               ;set shadow pens
  2418.  bsr TLWCheck
  2419.  bne .shbd                 ;bad if resized
  2420.  jsr _LVOText(a6)          ;print shadow text
  2421.  movem.l (a7)+,d0-d5/a0-a1
  2422.  movem.l d0-d5/a0-a1,-(a7)
  2423.  move.w rp_cp_x(a1),d4     ;d2 = lhs, d4 = rhs
  2424.  subq.w #1,d4
  2425.  move.l d1,d3              ;d3 = top
  2426.  move.l rp_Font(a1),a0
  2427.  sub.w tf_Baseline(a0),d3  ;d3 rel to top of text
  2428.  move.l d3,d5
  2429.  add.w tf_YSize(a0),d5     ;d5 = bot
  2430.  subq.w #1,d5
  2431.  move.l xxp_FWork(a4),a6   ;d0,d1 = dx,dy from xxp_xshdv
  2432.  moveq #0,d0
  2433.  move.b .shad+3(a6),d0
  2434.  ext.w d0
  2435.  neg.w d0
  2436.  moveq #0,d1
  2437.  move.b .shad+2(a6),d1
  2438.  ext.w d1
  2439.  neg.w d1
  2440.  move.l xxp_gfxb(a4),a6
  2441.  bsr TLWCheck
  2442.  bne.s .shbd               ;bad if resized
  2443.  jsr _LVOScrollRaster(a6)  ;scroll shadow
  2444.  movem.l (a7)+,d0-d5/a0-a1
  2445.  move.l (a7),xxp_FrontPen(a5) ;original pens, jam1
  2446.  movem.l d0-d5/a0-a1,-(a7)
  2447.  move.b #RP_JAM1,xxp_DrawMode(a5)
  2448.  movem.l d0-d1/a0-a1,-(a7)
  2449.  move.l d2,d0
  2450.  jsr _LVOMove(a6)          ;move back to start of text
  2451.  movem.l (a7)+,d0-d1/a0-a1
  2452.  bsr TLWpens
  2453.  bsr TLWCheck              ;bad if resized
  2454.  bne.s .shbd
  2455.  jsr _LVOText(a6)          ;jam1 text over shadow
  2456.  movem.l (a7)+,d0-d5/a0-a1
  2457.  move.l (a7)+,xxp_FrontPen(a5) ;restore pens, drawmode
  2458.  bra.s .txun
  2459. .shbd:
  2460.  movem.l (a7)+,d0-d5/a0-a1
  2461.  move.l (a7)+,xxp_FrontPen(a5)
  2462.  bra .txtb
  2463.  
  2464. .txdo:
  2465.  bsr TLWCheck              ;* go if window resized
  2466.  bne .txtb
  2467.  
  2468.  jsr _LVOText(a6)          ;* print the text
  2469.  
  2470. .txun:
  2471.  move.b (a3),d0            ;get underlining bits
  2472.  and.b #$3C,d0
  2473.  beq .txtg                 ;go if none
  2474.  cmp.b #$08,d0
  2475.  beq .txtg                 ;go if super/subscript
  2476.  cmp.b #$10,d0
  2477.  beq .txtg
  2478.  
  2479. .yund:                     ;* under/overlining
  2480.  
  2481.  move.l xxp_WPort(a5),a1   ;get posn for single underline
  2482.  move.l rp_Font(a1),a0
  2483.  move.w tf_Baseline(a0),d0
  2484.  addq.w #1,d0
  2485.  cmp.w tf_YSize(a0),d0
  2486.  bcc .txtg                 ;none if no room for underline (unlikely)
  2487.  
  2488.  move.w rp_cp_x(a1),d0
  2489.  cmp.w d0,d2               ;none if text width = 0 (unlikely)
  2490.  beq .txtg
  2491.  
  2492.  subq.w #1,d0              ;d0,d3 = rhs xpos of text
  2493.  move.w d0,d3
  2494.  move.w rp_cp_y(a1),d1     ;} d2=lhs d3=rhs d1=baseline a1=port
  2495.  
  2496.  btst #5,(a3)              ;go if not bit 5
  2497.  beq.s .sngr
  2498.  btst #2,(a3)              ;bit 5+2 = strike thru
  2499.  bne .sthr
  2500.  move.w #$CCCC,rp_LinePtrn(a1) ;bit 5 = dotted under
  2501.  bra.s .sing
  2502.  
  2503. .sngr:                     ;overline only has .01.
  2504.  btst #4,(a3)
  2505.  bne.s .sing
  2506.  btst #3,(a3)
  2507.  bne.s .over               ;go if overline only
  2508.  
  2509. .sing:                     ;do a single underline
  2510.  addq.w #1,d1              ;go to 1 pixel under .ulin
  2511.  movem.l d1/a1,-(a7)
  2512.  jsr _LVOMove(a6)          ;move to end of underline
  2513.  movem.l (a7)+,d1/a1
  2514.  move.l d2,d0              ;d0 = start of underline
  2515.  bsr TLWCheck              ;bad if window resized
  2516.  bne .ttbr
  2517.  movem.l d1/a1,-(a7)
  2518.  jsr _LVODraw(a6)          ;draw underline
  2519.  movem.l (a7)+,d1/a1
  2520.  move.w #-1,rp_LinePtrn(a1)
  2521.  
  2522.  subq.w #1,d1              ;} d2=lhs d3=rhs d1=baseline a1=port
  2523.  btst #5,(a3)
  2524.  bne .txtg
  2525.  btst #3,(a3)              ;go unless double underline
  2526.  beq.s .over
  2527.  
  2528.  btst #4,(a3)              ;do a double underline
  2529.  beq.s .over
  2530.  move.l rp_Font(a1),a0
  2531.  move.w tf_Baseline(a0),d0
  2532.  addq.w #3,d0
  2533.  cmp.w tf_YSize(a0),d0
  2534.  bcc.s .over               ;not if no room for double underline
  2535.  move.w d2,d0
  2536.  addq.w #3,d1              ;go to 2 pixels under 1st underline
  2537.  movem.l d1/a1,-(a7)
  2538.  jsr _LVOMove(a6)          ;move to start of 2nd underline
  2539.  movem.l (a7)+,d1/a1
  2540.  move.l d3,d0              ;d0 = rhs of underline
  2541.  bsr TLWCheck              ;bad if window resized
  2542.  bne .txtb
  2543.  movem.l d1/a1,-(a7)
  2544.  jsr _LVODraw(a6)          ;draw 2nd underline
  2545.  movem.l (a7)+,d1/a1
  2546.  subq.w #3,d1              ;} d2=lhs d2=rhs d1=baseline a1=port
  2547.  
  2548. .over:
  2549.  btst #2,(a3)              ;go unless overline
  2550.  beq .txtg
  2551.  btst #3,(a3)
  2552.  bne.s .ovry
  2553.  btst #4,(a3)
  2554.  beq.s .txtg
  2555. .ovry:
  2556.  
  2557.  move.l rp_Font(a1),a0     ;draw an overline
  2558.  sub.w tf_Baseline(a0),d1  ;d1 = top of text
  2559.  movem.l d0-d5/a1,-(a7)
  2560.  move.l d3,d4              ;scroll text down a pixel
  2561.  move.l d1,d3
  2562.  move.l d1,d5
  2563.  add.w tf_YSize(a0),d5
  2564.  subq.w #1,d5
  2565.  moveq #0,d0
  2566.  moveq #-1,d1
  2567.  bsr TLWCheck
  2568.  bne.s .ovrb
  2569.  jsr _LVOScrollRaster(a6)
  2570.  movem.l (a7)+,d0-d5/a1
  2571.  movem.l d0-d5/a1,-(a7)    ;draw the overline
  2572.  move.l d2,d0
  2573.  movem.l d1/a1,-(a7)
  2574.  jsr _LVOMove(a6)
  2575.  movem.l (a7)+,d1/a1
  2576.  move.l d3,d0
  2577.  bsr TLWCheck
  2578.  bne.s .ovrb
  2579.  jsr _LVODraw(a6)
  2580.  movem.l (a7)+,d0-d5/a1
  2581.  bra.s .txtg
  2582. .ovrb:
  2583.  movem.l (a7)+,d0-d5/a1
  2584.  bra.s .txtb
  2585.  
  2586. .sthr:                     ;draw a strike thru
  2587.  move.l rp_Font(a1),a0
  2588.  move.w tf_Baseline(a0),d0
  2589.  lsr.w #1,d0
  2590.  sub.w d0,d1
  2591.  move.l d2,d0
  2592.  movem.l d1/a1,-(a7)
  2593.  jsr _LVOMove(a6)
  2594.  movem.l (a7)+,d1/a1
  2595.  move.l d3,d0
  2596.  bsr TLWCheck
  2597.  bne.s .txtb
  2598.  jsr _LVODraw(a6)
  2599.  
  2600. .txtg:                     ;* quit from .text
  2601.  moveq #-1,d0              ;NE if good
  2602.  movem.l (a7)+,d0-d3/a0-a3/a6
  2603.  rts
  2604.  
  2605. .ttbr:
  2606.  move.w #-1,rp_LinePtrn(a1)
  2607.  
  2608. .txtb:
  2609.  moveq #0,d0               ;EQ if bad (window resized)
  2610.  movem.l (a7)+,d0-d3/a0-a3/a6
  2611.  rts
  2612.  
  2613. .prcp:                     ;** copy EBmap to tablet from d2 to d3 width d4
  2614.  movem.l d0-d6/a0-a1/a6,-(a7) ;save all
  2615.  move.l d2,d0              ;d0,d1 = from
  2616.  moveq #0,d1
  2617.  move.l d3,d2              ;d2,d3 = to
  2618.  add.w xxp_LeftEdge(a5),d2
  2619.  add.w .tabx+2(a6),d2
  2620.  moveq #0,d3
  2621.  add.w xxp_TopEdge(a5),d3
  2622.  add.w .taby+2(a6),d3
  2623.  move.l .tabh(a6),d5       ;d4,d5 = dims
  2624.  move.l xxp_EBmap(a4),a0   ;a0 = ebmap
  2625.  move.l xxp_WPort(a5),a1   ;a1 = rastport
  2626.  move.l xxp_gfxb(a4),a6
  2627.  move.w #$00C0,d6          ;d6 = JAM2
  2628.  bsr TLWCheck
  2629.  bne.s .prpb               ;bad if window resized
  2630.  jsr _LVOBltBitMapRastPort(a6) ;do the blit
  2631. .prpg:
  2632.  moveq #-1,d0              ;NE if good
  2633.  movem.l (a7)+,d0-d6/a0-a1/a6
  2634.  rts
  2635. .prbg:
  2636.  movem.l (a7)+,d0-d1/a0-a1
  2637. .prpb:
  2638.  moveq #0,d0               ;EQ if bad (window resized)
  2639.  movem.l (a7)+,d0-d6/a0-a1/a6
  2640.  rts
  2641.  
  2642. .prpq:                     ;** clear any of centre/clear offset on tablet
  2643.  movem.l d0-d3/a0-a1/a6,-(a7) ;adds 28+rts = 32 bytes to stack
  2644.  move.l d6,d2
  2645.  sub.w .offs(a6),d2        ;text offset - tab offset = amt to clear
  2646.  move.w d2,.this(a6)       ;.this = width cleared
  2647.  cmp.w .prev(a6),d2        ;is this < .prev ?
  2648.  bcs.s .prqc               ;yes, ok
  2649.  move.w .prev(a6),d2       ;no, only do .prev
  2650.  beq.s .prqg               ;or, nothing if .prev = 0
  2651. .prqc:
  2652.  move.l xxp_gfxb(a4),a6
  2653.  moveq #0,d0               ;foreground pen to 0, draw mode to jam2
  2654.  move.l xxp_WPort(a5),a1
  2655.  jsr _LVOSetAPen(a6)
  2656.  moveq #RP_JAM2,d0
  2657.  move.l xxp_WPort(a5),a1
  2658.  jsr _LVOSetDrMd(a6)
  2659.  move.l xxp_FWork(a4),a6
  2660.  move.l .tabx(a6),d0       ;d0 = lhs of tablet (rel to window)
  2661.  add.w xxp_LeftEdge(a5),d0
  2662.  add.w d0,d2
  2663.  subq.w #1,d2              ;d2 = rhs of area to be cleared
  2664.  move.l .taby(a6),d1       ;d1 = top of tablet (rel to window)
  2665.  add.w xxp_TopEdge(a5),d1
  2666.  move.l d1,d3
  2667.  add.l .tabh(a6),d3        ;d3 = bot of tablet
  2668.  subq.w #1,d3
  2669.  move.l xxp_WPort(a5),a1
  2670.  move.l xxp_gfxb(a4),a6
  2671.  bsr TLWCheck              ;go if can't (window resized)
  2672.  bne.s .prqb
  2673.  jsr _LVORectFill(a6)
  2674. .prqg:
  2675.  moveq #-1,d0
  2676.  movem.l (a7)+,d0-d3/a0-a1/a6 ;NE if ok
  2677.  rts
  2678. .prqb:
  2679.  moveq #0,d0
  2680.  movem.l (a7)+,d0-d3/a0-a1/a6 ;EQ if bad (window resized)
  2681.  rts
  2682.  
  2683. .prpv:                     ;** clear tablet between .this and .prev
  2684.  movem.l d0-d3/a0-a1/a6,-(a7) ;adds 28+rts = 32 bytes to stack
  2685.  moveq #0,d0
  2686.  move.b .clr0+1(a6),d0     ;background colour to foreground, drmd to jam2
  2687.  move.l xxp_WPort(a5),a1
  2688.  move.l xxp_gfxb(a4),a6
  2689.  jsr _LVOSetAPen(a6)
  2690.  moveq #RP_JAM2,d0
  2691.  move.l xxp_WPort(a5),a1
  2692.  jsr _LVOSetDrMd(a6)
  2693.  move.l xxp_FWork(a4),a6
  2694.  move.l .tabx(a6),d0       ;d0 = lhs of tablet (rel to window)
  2695.  add.w xxp_LeftEdge(a5),d0
  2696.  move.w d0,d2
  2697.  add.w .this(a6),d0        ;lhs from lhs + .this
  2698.  add.w .prev(a6),d2        ;rhs to lhs + .prev - 1
  2699.  subq.w #1,d2
  2700.  move.l .taby(a6),d1       ;d1 = top of tablet (rel to window)
  2701.  add.w xxp_TopEdge(a5),d1
  2702.  move.l d1,d3
  2703.  add.l .tabh(a6),d3        ;d3 = bot of tablet
  2704.  subq.w #1,d3
  2705.  move.l xxp_WPort(a5),a1
  2706.  move.l xxp_gfxb(a4),a6
  2707.  bsr TLWCheck              ;go if can't (window resized)
  2708.  bne.s .prvb
  2709.  jsr _LVORectFill(a6)
  2710. .prvg:
  2711.  moveq #-1,d0
  2712.  movem.l (a7)+,d0-d3/a0-a1/a6 ;NE if ok
  2713.  rts
  2714. .prvb:
  2715.  moveq #0,d0
  2716.  movem.l (a7)+,d0-d3/a0-a1/a6 ;EQ if bad (window resized)
  2717.  rts
  2718.  
  2719. .totl:                     ;** pre-scan the text
  2720.  
  2721. ;saves all except results in d4-d7
  2722. ;if no crsr bit is set in styl, d4 & d6 will be -1
  2723.  
  2724. ; returns d7 = width (in pixels)
  2725. ;         d6 = crsr lhs (-1 if no crsr)
  2726. ;         d4 = crsr rhs (-1 if no crsr
  2727. ;         d5 = no. of chrs
  2728. ; if ltyp = centre/rjust, puts initial offset in .toff
  2729. ; if ltyp = fjust, fixes Tspc and puts just remainder in .ljsr
  2730.  
  2731.  movem.l d0-d3/a0-a3,-(a7) ;save all except d4-d7
  2732.  move.w #-1,.ljsr(a6)      ;so far, no fjust remainder
  2733.  move.l .txip(a6),a0       ;a0 scans text
  2734.  move.l .stip(a6),a1       ;a1 scans styl
  2735.  move.w .cspc(a6),xxp_Tspc(a5) ;initialise xxp_Tspc
  2736.  moveq #-1,d6              ;d6,d4 will hold crsr lhs,rhs
  2737.  moveq #-1,d4
  2738.  moveq #0,d7               ;d7 holds total
  2739. .ttnx:
  2740.  tst.b (a0)                ;go if eol
  2741.  beq.s .ttqt
  2742.  bsr .fore                 ;get len of next segment
  2743.  cmp.l .cura(a6),a1
  2744.  bne.s .ttnc
  2745.  move.l d7,d6              ;d6 = crsr lhs
  2746.  move.l d7,d4
  2747.  add.l d0,d4               ;d4 = crsr rhs
  2748.  move.l a0,d3
  2749.  sub.l .txip(a6),d3        ;d3 = chrs before crsr
  2750. .ttnc:
  2751.  add.l d0,d7               ;bump total width
  2752.  move.l a2,a0              ;point a0,a1 to next segment
  2753.  move.l a3,a1
  2754.  bra .ttnx                 ;& continue
  2755. .ttqt:
  2756.  clr.w .toff(a6)           ;text offset = 0 pro-tem
  2757.  move.l a0,d5              ;d5 = chrs
  2758.  sub.l .txip(a6),d5
  2759.  tst.w .maxw(a6)           ;go if .maxw undefined
  2760.  beq .ttdn
  2761.  cmp.w .maxw(a6),d7        ;go if width >= .maxw
  2762.  bcc .ttdn
  2763.  cmp.w #1,.ltyp(a6)
  2764.  bcs .ttdn                 ;go if ljust
  2765.  beq.s .ttct               ;go if centre
  2766.  cmp.w #2,.ltyp(a6)
  2767.  beq.s .ttrj               ;go if rjust
  2768.  moveq #0,d0
  2769.  move.w .maxw(a6),d0
  2770.  sub.w d7,d0               ;adjust for full just:  d0 = total to spread
  2771.  move.w d5,d1
  2772.  subq.w #1,d1              ;d1 = no. of gaps
  2773.  ble.s .ttdn               ;go if <1
  2774.  divu d1,d0                ;d0 = quotient
  2775.  tst.w .mxjs(a6)
  2776.  beq.s .mxj0               ;force if mxjs = 0
  2777.  cmp.w .mxjs(a6),d0
  2778.  bcc.s .ttdn               ;go if >= .mxjs
  2779. .mxj0:
  2780.  move.w .maxw(a6),d7       ;width now = .maxw
  2781.  addq.w #1,d0
  2782.  add.w d0,xxp_Tspc(a5)     ;bump Tspc by quotient + 1
  2783.  subq.w #1,d0
  2784.  swap d0
  2785.  move.w d0,.ljsr(a6)       ;put remainder in .ljsr
  2786.  swap d0
  2787.  tst.l d6                  ;go if no crsr
  2788.  bmi.s .ttdn
  2789.  move.w d0,d1              ;adjust posn of crsr...
  2790.  mulu d3,d1                ;d1 = crsr * quot
  2791.  add.w d1,d6               ;which add to crsr start, end
  2792.  add.w d1,d4
  2793.  addq.w #1,d3
  2794.  cmp.w d5,d3
  2795.  bcc.s .ttrm
  2796.  add.w d0,d4               ;add bits/chr to crsr end, unless crsr is at end
  2797. .ttrm:
  2798.  subq.w #1,d3
  2799.  swap d0                   ;d0 = remainder
  2800.  move.w d0,d1
  2801.  cmp.w d3,d1               ;d1 = least of crsr tab, remainder
  2802.  ble.s .ttcy
  2803.  move.w d3,d1
  2804. .ttcy:
  2805.  add.w d1,d6               ;which add to crsr lhs, rhs
  2806.  add.w d1,d4
  2807.  cmp.w d3,d0               ;is remainder > crsr tab?
  2808.  ble.s .ttdn               ;yes, go
  2809.  addq.w #1,d4              ;no, add 1 to crsr rhs
  2810.  bra.s .ttdn
  2811. .ttct:                     ;adjust for centre
  2812.  move.w .maxw(a6),d0
  2813.  sub.w d7,d0
  2814.  lsr.w #1,d0               ;d0 = half unused dots
  2815. .ttfx:
  2816.  add.w d0,.toff(a6)        ;put offset in xxp_valu
  2817.  add.w d0,d4               ;add to posn of everything
  2818.  add.w d0,d6
  2819.  add.w d0,d7
  2820.  bra.s .ttdn
  2821. .ttrj:                     ;adjust for right just
  2822.  move.w .maxw(a6),d0
  2823.  sub.w d7,d0               ;d0 = unused dots
  2824.  bra .ttfx                 ;add to everything
  2825. .ttdn:
  2826.  movem.l (a7)+,d0-d3/a0-a3
  2827.  rts
  2828.  
  2829. .fore:                     ;** find end, length of segment at a0,a1
  2830.  move.l a0,a2              ;saves all except d0,a2,a3
  2831.  move.l a1,a3              ;a2,a3 scans chrs
  2832.  move.b (a1),d0            ;d0 = 1st chr styl
  2833.  addq.l #1,a2
  2834.  addq.l #1,a3              ;past 1st chr
  2835.  tst.w .ifix(a6)
  2836.  bgt.s .forp               ;first chr alone if forcing prop to be fixed
  2837.  cmp.l .cura(a6),a1
  2838.  bne.s .frcc               ;first chr alone if cursor
  2839.  bra.s .forp
  2840. .forc:
  2841.  addq.l #1,a2              ;find last chr of segment...
  2842.  addq.l #1,a3
  2843. .frcc:
  2844.  tst.b (a2)                ;eol follows?
  2845.  beq.s .forp               ;yes, end of segment
  2846.  cmp.l .cura(a6),a3        ;crsr chr follows?
  2847.  beq.s .forp               ;yes, segment ends
  2848.  cmp.l .bmpa(a6),a3        ;fjust bump follows?
  2849.  beq.s .forp               ;yes, segment ends
  2850.  cmp.b (a3),d0             ;same styl follows?
  2851.  beq .forc                 ;yes, segment continues
  2852.  
  2853. .forp:                     ;** alt entry point to .fore - a2,a3 already set
  2854.  movem.l d1/a1,-(a7)       ;save all except result in d0 (a2,a3 preserved)
  2855.  move.l a2,d0              ;set d0 = no. of chrs
  2856.  sub.l a0,d0
  2857.  moveq #0,d1               ;set xxp_Fsty
  2858.  move.b (a1),d1
  2859.  move.w d1,xxp_Fsty(a5)
  2860.  move.l xxp_WPort(a5),a1   ;a1 = WPort/ERport
  2861.  move.w xxp_Tspc(a5),rp_TxSpacing(a1) ;set TxSpacing
  2862.  bsr TLWfont               ;attach font to rastport if required
  2863.  move.l xxp_gfxb(a4),a6
  2864.  
  2865.  movem.l a0-a2,-(a7)       ;* get text extent
  2866.  sub.w #te_SIZEOF,a7
  2867.  move.l a7,a2
  2868.  jsr _LVOTextExtent(a6)
  2869.  moveq #0,d0
  2870.  move.w te_Width(a7),d0
  2871.  move.w te_Extent+4(a7),d1
  2872.  addq.w #1,d1
  2873.  sub.w d0,d1
  2874.  bcc.s .emax
  2875.  moveq #0,d1
  2876. .emax:
  2877. ; btst #6,xxp_Fsty+1(a5)
  2878. ; beq.s .emxg
  2879. ; add.b xxp_shad+3(a5),d1   ;if shadow, add dx to xmax (no, don't, problems)
  2880. .emxg:
  2881.  move.w d1,xxp_xmax(a5)    ;set xxp_xmax
  2882.  neg.w te_Extent(a7)
  2883.  bpl.s .emin
  2884.  clr.w te_Extent(a7)
  2885. .emin:
  2886.  move.w te_Extent(a7),xxp_xmin(a5) ;set xxp_xmin
  2887.  add.w #te_SIZEOF,a7
  2888.  movem.l (a7)+,a0-a2
  2889.  move.l xxp_FWork(a4),a6
  2890.  add.w xxp_xmax(a5),d0     ;bump length by xmax, xmin
  2891.  add.w xxp_xmin(a5),d0
  2892.  
  2893.  tst.w .ifix(a6)           ;if forcing prop to be fixed, adjust len
  2894.  ble.s .pfgd
  2895.  clr.w .ifof(a6)           ;ifof = 0 if no adjustment made
  2896.  cmp.w .ifxv(a6),d0
  2897.  bcc.s .pfgd               ;go if width >= tf_XSize of font
  2898.  neg.w d0
  2899.  add.w .ifxv(a6),d0
  2900.  move.w d0,.ifof(a6)       ;else, set ifof = amount by which width bumped
  2901.  move.w .ifxv(a6),d0       ;& set width to tf_XSize of font
  2902.  
  2903. .pfgd:
  2904.  tst.b (a2)
  2905.  bne.s .pfin
  2906.  sub.w xxp_Tspc(a5),d0     ;sub Tspc from after last chr
  2907. .pfin:
  2908.  movem.l (a7)+,d1/a1       ;a2,a3 = end of string, d0 = width
  2909.  rts
  2910.  
  2911. .tidy:                     ;** tidy FWork+768
  2912.  tst.b xxp_chnd+2(a4)
  2913.  bpl.s .tyqt               ;go if no contin line
  2914.  movem.l d0/a0-a2,-(a7)    ;saves all
  2915.  move.l xxp_FWork(a4),a0
  2916.  move.l a0,a1
  2917.  add.w #512,a0             ;a0 = contin text
  2918.  add.w #768,a1             ;a1 = contin styl
  2919.  clr.b -1(a1)
  2920.  move.l a1,a2              ;a2 = limit of contin styl
  2921.  add.w #256,a2
  2922. .tyeo:
  2923.  addq.l #1,a1              ;find corresponding styl to
  2924.  tst.b (a0)+               ;end of text
  2925.  bne .tyeo
  2926.  subq.l #1,a1              ;a1 = byte after end of styl
  2927.  move.b -1(a1),d0          ;d0 = last byte of styl (od 0 if null)
  2928. .tytd:
  2929.  move.b d0,(a1)+           ;continue last byte of styl to eol
  2930.  cmp.l a2,a1
  2931.  bcs .tytd
  2932.  movem.l (a7)+,d0/a0-a2
  2933. .tyqt:
  2934.  rts
  2935.  
  2936.  
  2937. ; TLReqedit subroutine - swap text around for reverse printing
  2938. ; (note: if crsr is at eol, it has a spc poked there before .swap called)
  2939.  
  2940. .swap:
  2941.  tst.w .revs(a6)           ;go if printing not reversed
  2942.  beq.s .szqt
  2943.  
  2944.  movem.l d0-d1/a0-a3,-(a7) ;save all
  2945.  
  2946.  move.l xxp_FWork(a4),a0   ;tfr chrs from FWork,FWork+256 to buff,buff+256
  2947.  move.l a0,a1
  2948.  add.w #256,a1
  2949.  move.l a4,a2
  2950.  move.l a2,a3
  2951.  add.w #256,a3
  2952. .swtf:
  2953.  move.b (a1)+,(a3)+
  2954.  move.b (a0)+,(a2)+
  2955.  bne .swtf
  2956.  
  2957.  subq.l #2,a2              ;a2 points to last chr of text
  2958.  subq.l #1,a3              ;a3 points to delimiter of styl
  2959.  move.l xxp_FWork(a4),a0   ;a0 points to FWork
  2960.  move.l a0,a1
  2961.  add.w #256,a1             ;a1 points to styl
  2962.  
  2963.  tst.w .crsr(a6)           ;go if no crsr
  2964.  bmi.s .swnc
  2965.  move.l a2,d0              ;move crsr to mirror image
  2966.  sub.l a4,d0
  2967.  sub.w .crsr(a6),d0
  2968.  move.w d0,.crsr(a6)
  2969.  add.l a1,d0
  2970.  move.l d0,.cura(a6)       ;fix .cura
  2971. .swnc:
  2972.  
  2973.  move.l .bmpa(a6),d1       ;fix .bmpa, if any
  2974.  beq.s .swnb
  2975.  sub.l a1,d1
  2976.  move.l a2,d0
  2977.  sub.l a4,d0
  2978.  sub.w d1,d0
  2979.  add.l a1,d0
  2980.  move.l d1,.bmpa(a6)
  2981. .swnb:
  2982.  
  2983.  addq.l #1,a2              ;point a2 to delimiter of text
  2984. .swpt:
  2985.  move.b -(a2),(a0)+        ;tfr text backward to FWork
  2986.  move.b -(a3),(a1)+        ;tfr styl backward to FWork+256
  2987.  cmp.l a2,a4
  2988.  bne .swpt                 ;until everything reversed
  2989.  
  2990.  movem.l (a7)+,d0-d1/a0-a3
  2991.  
  2992. .szqt:
  2993.  rts
  2994.  
  2995.  
  2996. ; local strings for TLReqedit
  2997. .str: dc.b 0
  2998.  dc.b 'The following keyboard options MAY be currently available...',0 ;1
  2999.  dc.b '(The screen will beep if you choose a currently forbidden option)',0
  3000.  dc.b ' ',0 ;3
  3001.  dc.b 'Del        Delete a character      Crtl L  Left justify line',0 ;4
  3002.  dc.b 'Shift Del  Delete line forward     Ctrl R  Right justify line',0 ;5
  3003.  dc.b 'Backspace  Cursor left, Delete     Ctrl J  Full justify line',0 ;6
  3004.  dc.b 'Shift Bsp  Delete line backward    Ctrl C  Centre line',0 ;7
  3005.  dc.b 'Tab        To line start/end       Ctrl P  Force Fixed',0 ;8
  3006.  dc.b '                                   Ctrl B  Bold font on/off',0 ;9
  3007.  dc.b 'Ctrl X     X-out (erase) line      Ctrl I  Italic font on/off',0 ;10
  3008.  dc.b '                                   Ctrl O  Dotted underline',0
  3009.  dc.b 'Return   Exit line/Accept          Ctrl S  Shadow font',0
  3010.  dc.b 'Esc      Exit line/Cancel          Ctrl W  Wide font',0 ;13
  3011.  dc.b '                                   Ctrl U  Underline',0 ;14
  3012.  dc.b 'Shift Ctrl S  Space fill           Ctrl Up arrow  Superscript',0 ;15
  3013.  dc.b 'Shift Ctrl C  Complement line      Ctrl Down arr  Subscript',0 ;16
  3014.  dc.b 'Shift Ctrl U  Undo last action     Ctrl E,F,G,H various underline',0
  3015.  dc.b 'Shift Ctrl R  Restore (undo all)   Ctrl V  Strike through',0 ;18
  3016.  ds.w 0
  3017.  
  3018.  
  3019. *>>>> enter a password    (D0=maxlen)
  3020. TLPassword:
  3021.  move.l xxp_strg(a4),-(a7)
  3022.  movem.l d0-d7/a0-a6,-(a7) ;save all except result in D0
  3023.  move.l a7,xxp_Stak(a4)
  3024.  clr.l xxp_kybd(a4)        ;(result will be here)
  3025.  sub.w #xxp_WPort+4,a7     ;create dummy part xxp_wsuw
  3026.  move.l d0,d7              ;d7 = input d0
  3027.  
  3028.  move.l a7,a5              ;a5 points to dummy part xxp_wsuw
  3029.  bsr TLReqredi             ;set pop window, default values to xxp_prfp
  3030.  beq .quit                 ;go if TLReqredi fails - unlikely
  3031.  
  3032.  move.l d7,d2              ;d2 = width
  3033.  mulu #8,d2
  3034.  addq.l #4,d2
  3035.  cmpi.w #64,d2
  3036.  bcc.s .cry
  3037.  moveq #64,d2
  3038. .cry:
  3039.  addq.w #8,d2
  3040.  moveq #24,d3              ;d3 = height
  3041.  bsr TLReqchek             ;check req size & position
  3042.  beq .quit                 ;go if won't fit
  3043.  
  3044.  tst.w xxp_ReqNull(a4)     ;quit ok if ReqNull=0
  3045.  beq .quit
  3046.  
  3047.  bsr TLReqon               ;open requester window
  3048.  beq .quit                 ;go if can't
  3049.  
  3050.  TLnewfont #0,#0,#0        ;use Topaz/8, zero spacing
  3051.  clr.w xxp_Tspc(a5)
  3052.  
  3053.  move.l #.str,xxp_strg(a4)
  3054.  move.w #$0103,xxp_FrontPen(a5)
  3055.  moveq #1,d0
  3056.  bsr TLStrbuf
  3057.  TLtext #4,#2
  3058.  move.l d7,d4
  3059.  mulu #8,d4
  3060.  addq.w #4,d4
  3061.  TLreqbev #4,#12,d4,#10
  3062.  subq.w #8,d4
  3063.  
  3064.  bsr TLHook2
  3065.  
  3066.  clr.b (a4)
  3067.  move.b #$FF,0(a4,d7.w)    ;so far, buff is not full
  3068.  
  3069. .echo:                     ;echo input so far
  3070.  move.l #$0D,xxp_kybd(a4)
  3071.  tst.b 0(a4,d7.w)
  3072.  beq .clos                 ;quit automatically if buff full
  3073.  
  3074.  TLreqarea #6,#13,d4,#8
  3075.  move.l a4,a0
  3076.  moveq #6,d1
  3077.  moveq #13,d2
  3078. .echc:
  3079.  tst.b (a0)+
  3080.  beq.s .crsr
  3081.  TLpict #11,d1,d2
  3082.  addq.w #8,d1
  3083.  bra .echc
  3084. .crsr:
  3085.  move.l d1,d0
  3086.  bset #29,d0
  3087.  TLreqarea d1,d2,#8,#8,#1
  3088.  
  3089. .wait:
  3090.  move.l xxp_Help(a4),-(a7)
  3091.  move.w #2,xxp_Help(a4)
  3092.  move.w #5,xxp_Help+2(a4)
  3093. .wthp:
  3094.  bsr TLKeyboard
  3095.  move.l (a7)+,xxp_Help(a4)
  3096.  
  3097.  move.l d0,xxp_kybd(a4)
  3098.  cmp.b #$1B,d0
  3099.  beq.s .clos
  3100.  cmp.b #$0D,d0
  3101.  beq.s .clos
  3102.  
  3103.  move.l a4,a0
  3104. .fore:
  3105.  tst.b (a0)+
  3106.  bne .fore
  3107.  subq.l #1,a0
  3108.  
  3109.  cmp.b #$8B,d0
  3110.  beq.s .back
  3111.  cmp.b #32,d0
  3112.  bcs .wait
  3113.  cmp.b #127,d0
  3114.  bcs.s .put
  3115.  cmp.b #160,d0
  3116.  bcs .wait
  3117. .put:
  3118.  move.b d0,(a0)+
  3119.  clr.b (a0)
  3120.  bra .echo
  3121.  
  3122. .back:
  3123.  cmp.l a4,a0
  3124.  beq .wait
  3125.  clr.b -(a0)
  3126.  bra .echo
  3127.  
  3128. .clos:
  3129.  bsr TLReqoff              ;close requester window
  3130.  
  3131. .quit:
  3132.  move.w #-1,xxp_ReqNull(a4) ;leave ReqNull<>0
  3133.  bsr TLWslof
  3134.  add.w #xxp_WPort+4,a7
  3135.  movem.l (a7)+,d0-d7/a0-a6
  3136.  move.l (a7)+,xxp_strg(a4)
  3137.  move.l xxp_kybd(a4),d0     ;* EQ,D0=0 if bad, D0=$1B if canc, D0=$0D if ok
  3138.  rts                        ;* The typed-in password (if any) is in buff
  3139.  
  3140. .str: dc.b 0                ;local strings
  3141.  dc.b 'Password',0 ;1
  3142.  dc.b 'Input the password...',0 ;2
  3143.  dc.b '1. Type any typeable characters',0 ;3
  3144.  dc.b '2. Press the backspace key to backspace',0 ;4
  3145.  dc.b '3. Press the <Esc> key to cancel',0 ;5
  3146.  dc.b '4. Press the <Return> key when you''ve typed your password',0 ;6
  3147.  ds.w 0
  3148.  
  3149.  
  3150. *>>>> set tandem.library prefs (D0=0 set up, +1 palette disable -1 else)
  3151. TLPrefs:
  3152.  movem.l d0-d7/a0-a6,-(a7) ;save all
  3153.  tst.l d0
  3154.  bne .intr                 ;go if interacting
  3155.  
  3156. ; initial setup (called by TLWindow)
  3157.  
  3158.  move.l #xxp_ypsz,d0       ;create xxp_pref memory
  3159.  bsr TLPublic
  3160.  move.l d0,xxp_pref(a4)    ;pref size = xxp_ypsz
  3161.  beq.s .intq
  3162.  
  3163.  lea .fact,a0              ;tfr factory settings to xxp_pref
  3164.  move.l xxp_pref(a4),a1
  3165.  moveq #(xxp_ypsz/4)-1,d0
  3166. .ftfr:
  3167.  move.l (a0)+,(a1)+        ;tfr factory settings to xxp_pref
  3168.  dbra d0,.ftfr
  3169.  
  3170.  move.l a4,a0              ;attempt to lock ENV:Tandem/GUI
  3171.  move.l #'ENV:',(a0)+
  3172.  move.l #'Tand',(a0)+
  3173.  move.l #'em/G',(a0)+
  3174.  move.w #'UI',(a0)+
  3175.  clr.b (a0)
  3176.  move.l xxp_dosb(a4),a6
  3177.  move.l a4,d1
  3178.  moveq #ACCESS_READ,d2
  3179.  jsr _LVOLock(a6)
  3180.  move.l d0,d1
  3181.  beq.s .fgdd               ;go if can't (no GUI prefs exist)
  3182.  jsr _LVOUnLock(a6)        ;unlock
  3183.  
  3184.  bsr TLOpenread            ;open ENV:Tandem/GUI
  3185.  beq.s .fgdd
  3186.  move.l a4,d2              ;read into buff
  3187.  move.l #xxp_ypsz+2,d3
  3188.  bsr TLReadfile
  3189.  beq.s .fgdd               ;go if bad
  3190.  bsr TLClosefile           ;close
  3191.  subq.l #2,d3
  3192.  cmp.l d0,d3
  3193.  bne.s .fgdd               ;discard if wrong filesize
  3194.  subq.w #1,d0
  3195.  move.l a4,a0
  3196.  move.l xxp_pref(a4),a1
  3197. .fgtf:
  3198.  move.b (a0)+,(a1)+        ;tfr prefs as read to xxp_prefs
  3199.  dbra d0,.fgtf
  3200.  
  3201. .fgdd:
  3202.  clr.l xxp_errn(a4)        ;error only if out of mem
  3203.  moveq #-1,d0
  3204.  bra.s .intq               ;(ignore errors reading prefs file)
  3205.  
  3206. .bad0:
  3207.  moveq #0,d0
  3208.  
  3209. .intq:
  3210.  movem.l (a7)+,d0-d7/a0-a6 ;EQ if bad (i.e. out of public mem)
  3211.  rts
  3212.  
  3213. ; set preferences interactively
  3214.  
  3215. .intr:
  3216.  move.l xxp_strg(a4),-(a7) ;save global strings
  3217.  move.l #.str,xxp_strg(a4) ;install local strings
  3218.  move.l xxp_Active-2(a4),-(a7) ;save active window (if any) in lsw
  3219.  move.l xxp_Help(a4),-(a7) ;save callimg help
  3220.  move.w #74,xxp_Help(a4)   ;install help
  3221.  move.w #22,xxp_Help+2(a4)
  3222.  clr.l xxp_errn(a4)
  3223.  
  3224.  sub.w #xxp_ypsz+4,a7      ;copy of prefs in stack
  3225.  move.l d0,xxp_ypsz(a7)    ;remember input d0
  3226.  move.l a7,a6              ;a6 points to prefs
  3227.  move.l xxp_pref(a4),a0
  3228.  move.l a6,a1
  3229.  moveq #(xxp_ypsz/4)-1,d0  ;copy xxp_prefs to stack
  3230. .tfri:
  3231.  move.l (a0)+,(a1)+
  3232.  dbra d0,.tfri
  3233.  
  3234.  moveq #74,d0              ;preliminary info
  3235.  moveq #22,d1
  3236.  moveq #0,d2
  3237.  bsr TLReqinfo
  3238.  
  3239.  move.l xxp_WSuite(a4),a0  ;find an unused window
  3240.  moveq #0,d0
  3241. .fndw:
  3242.  tst.l xxp_Window(a0)
  3243.  beq.s .gtwd
  3244.  add.w #xxp_siz2,a0
  3245.  addq.w #1,d0
  3246.  cmp.w #10,d0
  3247.  bne .fndw
  3248.  
  3249.  moveq #96,d0              ;report & quit if no unused windows (unlikely)
  3250.  moveq #1,d1
  3251.  bsr TLReqinfo
  3252.  bra .done
  3253.  
  3254. .gtwd:                     ;open the TLprefs window
  3255.  moveq #0,d1
  3256.  moveq #0,d2
  3257.  move.l #188,d3
  3258.  move.l #114,d4
  3259.  move.l d3,d5
  3260.  move.l d4,d6
  3261.  moveq #1,d7               ;usual flags for requester
  3262.  bsr TLWindow              ;open requester window
  3263.  beq .bad                  ;go if can't
  3264.  move.l xxp_AcWind(a4),a5
  3265.  
  3266.  moveq #0,d0               ;put border around it
  3267.  moveq #0,d1
  3268.  move.l d3,d2
  3269.  move.l d4,d3
  3270.  bsr TLReqbev
  3271.  
  3272. ; draw the main window
  3273.  
  3274. .main
  3275.  moveq #2,d0               ;colour the window
  3276.  moveq #1,d1
  3277.  move.l #184,d2
  3278.  moveq #112,d3
  3279.  moveq #3,d4
  3280.  bset #29,d0
  3281.  bsr TLReqarea
  3282.  
  3283.  move.l xxp_AcWind(a4),a5  ;draw the text
  3284.  move.w #$0203,xxp_FrontPen(a5)
  3285.  moveq #3,d1
  3286.  moveq #1,d2
  3287.  moveq #10,d3
  3288. .mnln:
  3289.  move.l d2,d0
  3290.  bsr TLStrbuf
  3291.  moveq #10,d0
  3292.  bsr TLText
  3293.  move.b #1,xxp_FrontPen(a5)
  3294.  add.w #10,d1
  3295.  addq.w #1,d2
  3296.  dbra d3,.mnln
  3297.  
  3298.  moveq #6,d0               ;draw the bevs
  3299.  moveq #12,d1
  3300.  move.l #176,d2
  3301.  moveq #10,d3
  3302.  moveq #5,d4
  3303. .mnbx:
  3304.  bsr TLReqbev
  3305.  add.w #10,d1
  3306.  dbra d4,.mnbx
  3307.  add.w #10,d1
  3308.  bsr TLReqbev
  3309.  add.w #10,d1
  3310.  bsr TLReqbev
  3311.  add.w #10,d1
  3312.  
  3313.  move.w #59,d2             ;draw save/use/canc bevs
  3314.  bsr TLReqbev
  3315.  add.w d2,d0
  3316.  bsr TLReqbev
  3317.  add.w d2,d0
  3318.  subq.w #1,d2
  3319.  bsr TLReqbev
  3320.  
  3321. .wait:                     ;get user response to main window
  3322.  bsr TLWfront
  3323.  bsr TLKeyboard
  3324.  cmp.b #$1B,d0             ;cancel if Esc
  3325.  beq .canc
  3326.  cmp.b #$80,d0             ;else reject unless lmb
  3327.  bne .wait
  3328.  subq.w #6,d1
  3329.  bcs .wait
  3330.  cmp.w #177,d1
  3331.  bcc .wait
  3332.  
  3333.  move.l d2,d7              ;go to .bots, .font, or d7=0-5 for whichever
  3334.  sub.w #12,d7
  3335.  bcs .wait
  3336.  divu #10,d7
  3337.  and.l #$0000FFFF,d7
  3338.  cmp.w #7,d7               ;go if palette box
  3339.  beq .palt
  3340.  cmp.w #8,d7
  3341.  beq .tour
  3342.  cmp.w #9,d7               ;go if save/use/cancel
  3343.  beq .bots
  3344.  cmp.w #6,d7               ;else accept rows 0-5 only
  3345.  bcc .wait
  3346.  
  3347. ; d7 = 0-5 for whichever requester
  3348.  
  3349.  moveq #6,d0               ;clear bots area (bevs overlap)
  3350.  moveq #102,d1
  3351.  move.l #176,d2
  3352.  moveq #10,d3
  3353.  moveq #3,d4
  3354.  bset #29,d0
  3355.  bsr TLReqarea
  3356.  
  3357.  move.l xxp_AcWind(a4),a5  ;draw title
  3358.  move.w #$0203,xxp_FrontPen(a5)
  3359.  move.l d7,d0
  3360.  addq.w #2,d0
  3361.  bsr TLStrbuf
  3362.  moveq #10,d0
  3363.  moveq #3,d1
  3364.  bsr TLText
  3365.  subq.b #1,xxp_FrontPen(a5)
  3366.  
  3367.  moveq #13,d1              ;draw text
  3368.  moveq #12,d2
  3369.  moveq #9,d3
  3370. .rqln:
  3371.  move.l d2,d0
  3372.  cmp.w #8,d3               ;if title..
  3373.  bne.s .rqs0
  3374.  cmp.w #3,d7               ;  if prog, -> progress pen
  3375.  bne.s .rqs0
  3376.  moveq #22,d0
  3377. .rqs0:
  3378.  cmp.w #6,d3               ;if horz
  3379.  bne.s .rqs1
  3380.  cmp.w #3,d7               ;  if prog,data,show -> null
  3381.  bcc.s .rqsz
  3382. .rqs1:
  3383.  cmp.w #5,d3               ;if vert
  3384.  bne.s .rqs2
  3385.  cmp.w #3,d7               ;  if prog,data,show -> null
  3386.  bcc.s .rqsz
  3387. .rqs2:
  3388.  cmp.w #2,d3               ;always if factory,bots
  3389.  bcs.s .rqsy
  3390.  cmp.w #4,d3
  3391.  bcs.s .rqs3
  3392.  bne.s .rqsy
  3393.  cmp.w #3,d7
  3394.  beq.s .rqsz               ;  if prog -> null
  3395.  cmp.w #5,d7
  3396.  bne.s .rqs3               ;  if show -> data font
  3397.  moveq #23,d0
  3398.  bra.s .rqsy
  3399. .rqs3:                     ;if font size, spacing
  3400.  cmp.w #3,d7
  3401.  beq.s .rqsz               ;  if prog -> null
  3402.  cmp.w #5,d7
  3403.  bne.s .rqsy               ;  if show -> null
  3404. .rqsz:
  3405.  moveq #26,d0
  3406. .rqsy:
  3407.  bsr TLStrbuf
  3408.  moveq #10,d0
  3409.  bsr TLText
  3410.  add.w #10,d1
  3411.  addq.w #1,d2
  3412.  dbra d3,.rqln
  3413.  
  3414.  moveq #6,d0               ;draw bevs
  3415.  moveq #12,d1
  3416.  move.l #176,d2
  3417.  moveq #10,d3
  3418.  moveq #8,d4
  3419. .rqbx:
  3420.  bsr TLReqbev
  3421.  add.w #10,d1
  3422.  dbra d4,.rqbx
  3423.  
  3424.  moveq #88,d2              ;draw View/OK bevs
  3425.  bsr TLReqbev
  3426.  add.w d2,d0
  3427.  bsr TLReqbev
  3428.  
  3429. .rqwt:                     ;wait for response to req window
  3430.  bsr TLWfront
  3431.  bsr TLKeyboard
  3432.  cmp.b #$1B,d0             ;to main in Esc
  3433.  beq .main
  3434.  cmp.b #$80,d0             ;else reject unless lmb
  3435.  bne .rqwt
  3436.  subq.w #6,d1
  3437.  bcs .rqwt
  3438.  cmp.w #177,d1
  3439.  bcc .rqwt
  3440.  
  3441.  move.l d2,d6              ;d6 = row clicked
  3442.  sub.w #12,d6
  3443.  bmi .rqwt
  3444.  divu #10,d6
  3445.  cmp.w #9,d6
  3446.  bcc .rqbt
  3447.  
  3448.  move.l xxp_pref(a4),a3    ;d6=0-8 for row clicked, d7=0-5 for type
  3449.  add.w #xxp_ychs,a3        ;point a3 to xxp_pref for that type
  3450.  move.w d7,d0
  3451.  mulu #8,d0
  3452.  add.l d0,a3
  3453.  cmp.b #8,d6               ;go if factory
  3454.  beq .pfct
  3455.  cmp.b #3,d7               ;if prog...
  3456.  bne.s .bra0
  3457.  cmp.b #1,d6               ;  go if prog pen
  3458.  beq .pgpn
  3459. .bra0:
  3460.  cmp.b #3,d6               ;go if bg/ttl/txt pen
  3461.  bcs .ppen
  3462.  bne.s .bra1               ;if horz...
  3463.  cmp.b #3,d7
  3464.  bcc .rqwt                 ;  ignore if prog/data/show
  3465.  bra .phrz                 ;  else get horz
  3466. .bra1:
  3467.  cmp.b #5,d6
  3468.  bcc.s .bra2               ;if vert...
  3469.  cmp.w #3,d7
  3470.  bcc .rqwt                 ;  ignore if prog/data/show
  3471.  bra .pvrt                 ;  else get vert
  3472. .bra2:
  3473.  bne.s .bra3               ;if font...
  3474.  cmp.b #3,d7
  3475.  beq .rqwt                 ;  ignore if prog
  3476.  cmp.b #5,d7
  3477.  beq .sdft                 ;  if show -> get show data font
  3478.  bra .pfnt                 ;  else get font
  3479. .bra3:
  3480.  cmp.b #3,d7               ;no styl/spc for prog
  3481.  beq .rqwt
  3482.  cmp.b #5,d7               ;no styl/spc for show
  3483.  beq .rqwt
  3484.  cmp.b #7,d6               ;go if font spc
  3485.  bcc.s .pspc
  3486.  
  3487. .psty:                     ;get font style
  3488.  bsr .back
  3489.  moveq #108,d0
  3490.  moveq #7,d1
  3491.  moveq #1,d2
  3492.  bsr TLReqinfo             ;give instructions
  3493.  bsr .back
  3494.  moveq #122,d0
  3495.  moveq #5,d1
  3496.  bsr TLReqchoose           ;choose style
  3497.  sub.w #1,d0
  3498.  bmi .rqwt                 ;go if bad or cancel
  3499.  cmp.w #4,d0
  3500.  bcc .rqwt
  3501.  move.l xxp_pref(a4),a0
  3502.  move.b d0,xxp_ysty(a0)    ;put in prefs
  3503.  move.l d0,d1              ;attach to prefs window
  3504.  moveq #10,d0
  3505.  moveq #1,d2
  3506.  bsr TLNewfont
  3507.  bne .ftpk                 ;go if ok
  3508.  bsr .back
  3509.  moveq #57,d0
  3510.  moveq #3,d1
  3511.  moveq #0,d2
  3512.  bsr TLReqinfo             ;warn user if can't open font (unlikely)
  3513.  bra .rqwt
  3514.  
  3515. .pspc:                     ;get font spacing
  3516.  bsr .back
  3517.  moveq #115,d0
  3518.  moveq #7,d1
  3519.  moveq #1,d2
  3520.  bsr TLReqinfo             ;instructions
  3521.  
  3522.  bsr .back                 ;get input
  3523.  clr.b (a4)
  3524.  move.w #128,d0
  3525.  moveq #-1,d1
  3526.  moveq #1,d2
  3527.  moveq #0,d3
  3528.  bsr TLReqinput
  3529.  beq .rqwt
  3530.  move.l xxp_valu(a4),d0
  3531.  
  3532.  move.l xxp_pref(a4),a0    ;install new value
  3533.  move.b d0,xxp_yspc(a0)
  3534.  move.l xxp_AcWind(a4),a5
  3535.  move.w d0,xxp_RTspc(a5)
  3536.  bra .ftpk                 ;go report
  3537.  
  3538. .pfnt:                     ;get font
  3539.  bsr .back
  3540.  moveq #48,d0
  3541.  moveq #8,d1
  3542.  moveq #0,d2
  3543.  bsr TLReqinfo             ;show info
  3544.  moveq #10,d0
  3545.  bsr TLAslfont             ;put up requester
  3546.  bne.s .fpcu               ;go if ok
  3547.  tst.l xxp_errn(a4)
  3548.  beq .rqwt                 ;go if cancel
  3549.  bsr .back
  3550.  moveq #56,d0
  3551.  moveq #1,d1
  3552.  moveq #0,d2
  3553.  bsr TLReqinfo             ;display info if bad
  3554.  bra .rqwt
  3555. .fpcu:
  3556.  move.l xxp_pref(a4),a0    ;attach new font to window prefs data
  3557.  moveq #10,d0
  3558.  moveq #0,d1
  3559.  move.b xxp_ysty(a0),d1
  3560.  moveq #1,d2
  3561.  bsr TLNewfont
  3562.  bne.s .fpgd               ;go if ok
  3563.  moveq #57,d0
  3564.  moveq #3,d1
  3565.  moveq #0,d2
  3566.  bsr TLReqinfo             ;warn user if can't open font (unlikely)
  3567. .fpgd:
  3568.  move.l xxp_FSuite(a4),a0  ;tfr new font to xxp_pref
  3569.  add.w #10*xxp_fsiz,a0
  3570.  move.l xxp_pref(a4),a1
  3571.  move.w 4(a0),xxp_yhgt(a1)
  3572.  addq.l #8,a0
  3573. .fptf:
  3574.  move.b (a0)+,(a1)+
  3575.  bne .fptf
  3576. .ftpk:
  3577.  bsr .back
  3578.  moveq #60,d0
  3579.  moveq #3,d1
  3580.  moveq #0,d2
  3581.  bsr TLReqinfo
  3582.  bra .rqwt
  3583.  
  3584. .phrz:                     ;get horz
  3585.  move.w #129,d0
  3586.  moveq #3,d4               ;d0=header, d4=3 for horz
  3587. .phpk:                     ;vert joins here
  3588.  bsr .back
  3589.  clr.b (a4)                ;get horz/vert
  3590.  moveq #-1,d1
  3591.  moveq #1,d2
  3592.  moveq #0,d3
  3593.  bsr TLReqinput
  3594.  beq .rqwt
  3595.  move.l xxp_valu(a4),d0
  3596.  
  3597.  move.l xxp_pref(a4),a0    ;instal horz/vert
  3598.  move.l d7,d1
  3599.  lsl.w #3,d1
  3600.  add.l d1,a0
  3601.  add.w #xxp_ychs,a0
  3602.  move.b d0,0(a0,d4.w)
  3603.  bra .view                 ;go report
  3604.  
  3605. .pvrt:                     ;get vert
  3606.  move.w #130,d0
  3607.  moveq #4,d4               ;d4=4 for vert
  3608.  bra .phpk                 ;go join horz routine
  3609.  
  3610. .ppen:                     ;get bg/ttl/txt pen
  3611.  move.l xxp_strg(a4),-(a7)
  3612.  sub.w #256,a7             ;put instructions in stack
  3613.  move.l a7,a1
  3614.  clr.b (a1)+
  3615.  moveq #104,d0
  3616.  bsr TLStra0
  3617. .ppt0:
  3618.  move.b (a0)+,(a1)+        ;str 104
  3619.  bne .ppt0
  3620.  move.l d7,d0
  3621.  addq.w #2,d0
  3622.  bsr TLStra0
  3623. .ppt1:
  3624.  move.b (a0)+,(a1)+        ;req type
  3625.  bne .ppt1
  3626.  move.l d6,d0
  3627.  add.w #12,d0
  3628.  cmp.w #15,d0
  3629.  bne.s .ppcy
  3630.  moveq #22,d0
  3631. .ppcy:
  3632.  bsr TLStra0
  3633. .ppt2:
  3634.  move.b (a0)+,(a1)+        ;which pen
  3635.  bne .ppt2
  3636.  moveq #105,d0
  3637.  moveq #2,d1
  3638.  bsr TLStra0
  3639. .ppt3:
  3640.  move.b (a0)+,(a1)+        ;str 105-7
  3641.  bne .ppt3
  3642.  dbra d1,.ppt3
  3643.  moveq #1,d0
  3644.  moveq #6,d1
  3645.  moveq #1,d2
  3646.  move.l a7,xxp_strg(a4)
  3647.  bsr TLReqinfo             ;put instructions
  3648.  add.w #256,a7
  3649.  move.l (a7)+,xxp_strg(a4)
  3650.  moveq #0,d0               ;put color req (0 = pen only)
  3651.  bsr TLReqcolor
  3652.  subq.w #1,d0
  3653.  bmi .rqwt                 ;go if cancel
  3654.  move.l xxp_pref(a4),a0
  3655.  add.w #xxp_ychs,a0
  3656.  move.l d7,d1
  3657.  lsl.w #3,d1
  3658.  add.w d1,a0
  3659.  move.b d0,0(a0,d6.w)      ;put pen
  3660.  bra .view                 ;view requester with new pen
  3661.  
  3662. .pgpn:                     ;prog pen
  3663.  moveq #3,d6
  3664.  bra .ppen
  3665.  
  3666. .pfct:                     ;factory settings
  3667.  bsr .back
  3668.  move.w #138,d0
  3669.  moveq #2,d1
  3670.  moveq #2,d2
  3671.  bsr TLReqinfo             ;caution
  3672.  cmp.w #1,d0               ;ignore unless OK
  3673.  bne .rqwt
  3674.  
  3675.  lea .fact,a0              ;factory settings to xxp_pref
  3676.  move.l xxp_pref(a4),a1
  3677.  moveq #(xxp_ypsz/4)-1,d0
  3678. .pfc0:
  3679.  move.l (a0)+,(a1)+
  3680.  dbra d0,.pfc0
  3681.  
  3682.  move.l xxp_pref(a4),a0    ;get & open font 10
  3683.  moveq #10,d0
  3684.  moveq #8,d1
  3685.  move.l xxp_pref(a4),a0
  3686.  bsr TLGetfont
  3687.  move.l xxp_FSuite(a4),a0
  3688.  add.w #xxp_fsiz*10,a0
  3689.  bsr TLOfont
  3690.  
  3691.  moveq #10,d0              ;attach font 10 to reqs
  3692.  moveq #0,d1
  3693.  moveq #1,d2
  3694.  bsr TLNewfont
  3695.  
  3696.  move.l xxp_pref(a4),a0    ;get & open font 11
  3697.  add.w #xxp_yfsh,a0
  3698.  moveq #11,d0
  3699.  moveq #8,d1
  3700.  bsr TLGetfont
  3701.  move.l xxp_FSuite(a4),a0
  3702.  add.w #xxp_fsiz*11,a0
  3703.  bsr TLOfont
  3704.  
  3705.  move.l xxp_AcWind(a4),a5  ;update req data in current window
  3706.  move.l xxp_pref(a4),a0
  3707.  clr.w xxp_RFsty(a5)
  3708.  clr.w xxp_RTspc(a5)
  3709.  bra .rqwt
  3710.  
  3711. .sdft:                     ;get show data font
  3712.  bsr .back
  3713.  move.w #131,d0            ;instructions
  3714.  moveq #4,d1
  3715.  moveq #0,d2
  3716.  bsr TLReqinfo
  3717.  moveq #11,d0              ;get new font 11
  3718.  bsr TLAslfont
  3719.  bne.s .sdcu               ;go if ok
  3720.  tst.l xxp_errn(a4)
  3721.  beq .rqwt                 ;go if cancel
  3722.  bsr .back
  3723. .sdfl:
  3724.  moveq #56,d0
  3725.  moveq #1,d1
  3726.  moveq #0,d2
  3727.  bsr TLReqinfo             ;display info if bad
  3728.  bra .rqwt
  3729. .sdcu:
  3730.  move.l xxp_FSuite(a4),a0  ;tfr new font to xxp_pref
  3731.  add.w #11*xxp_fsiz,a0
  3732.  move.w #8,4(a0)           ;height always = 8
  3733.  move.l a0,a2
  3734.  addq.l #8,a2
  3735.  move.l xxp_pref(a4),a1    ;tfr fontname to pref
  3736.  add.w #xxp_yfsh,a1
  3737. .sdtf:
  3738.  move.b (a2)+,(a1)+
  3739.  bne .sdtf
  3740.  bsr TLOfont               ;open font 11
  3741.  bne.s .sdop               ;go if ok
  3742.  bsr .back
  3743.  move.w #135,d0
  3744.  moveq #1,d1
  3745.  moveq #0,d2
  3746.  bsr TLReqinfo             ;report can't open
  3747. .sdop:
  3748.  move.l xxp_FSuite(a4),a0
  3749.  add.w #xxp_fsiz*11,a0
  3750.  move.l 8(a0),a1
  3751.  btst #5,tf_Flags(a1)      ;go unless proportional
  3752.  beq .view
  3753.  bsr .back
  3754.  move.w #136,d0            ;report can't use proportional
  3755.  moveq #2,d1
  3756.  moveq #0,d2
  3757.  bsr TLReqinfo
  3758.  bra .view                 ;go view show requester as amended
  3759.  
  3760. .rqbt:                     ;req window bottom line clicked
  3761.  cmp.w #88,d1
  3762.  bcc .main                 ;to main if OK clicked
  3763.  
  3764. .view:
  3765.  cmp.w #1,d7               ;req window View box clicked
  3766.  bcs.s .chos
  3767.  beq .inpt
  3768.  cmp.w #3,d7
  3769.  bcs .info
  3770.  beq .prog
  3771.  cmp.w #5,d7
  3772.  bcs .data
  3773.  bra .show
  3774.  
  3775. .tour:                    ;tour of requesters
  3776.  bsr .chsd
  3777.  bsr .chs2
  3778.  bsr .inpd
  3779.  bsr .inf1
  3780.  bsr .inf2
  3781.  bsr .infd
  3782.  bsr .prgd
  3783.  bsr .datd
  3784.  bsr .shwd
  3785.  bra .wait
  3786.  
  3787. .chos:                     ;view choose req
  3788.  bsr.s .chsd
  3789.  bra .rqwt
  3790.  
  3791. .chsd:                     ;do a choose req
  3792.  bsr .back
  3793.  move.l xxp_Help(a4),-(a7)
  3794.  clr.l xxp_Help(a4)
  3795.  moveq #27,d0
  3796.  moveq #2,d1
  3797.  bsr TLReqchoose
  3798.  move.l (a7)+,xxp_Help(a4)
  3799.  rts
  3800.  
  3801. .chs2:                     ;do choose req - type 2
  3802.  bsr .back
  3803.  move.l xxp_Help(a4),-(a7)
  3804.  clr.l xxp_Help(a4)
  3805.  moveq #27,d0
  3806.  bsr TLStrbuf
  3807.  moveq #0,d1
  3808.  bsr TLReqchoose
  3809.  move.l (a7)+,xxp_Help(a4)
  3810.  rts
  3811.  
  3812. .inpt:                     ;view input req
  3813.  bsr.w .inpd
  3814.  bra .rqwt
  3815.  
  3816. .inpd:                     ;do input req
  3817.  bsr .back
  3818.  move.l xxp_Help(a4),-(a7)
  3819.  clr.l xxp_Help(a4)
  3820.  move.l #'Prom',(a4)
  3821.  move.w #'pt',4(a4)
  3822.  clr.b 6(a4)
  3823.  moveq #30,d0
  3824.  moveq #0,d1
  3825.  moveq #20,d2
  3826.  moveq #0,d3
  3827.  bsr TLReqinput
  3828.  move.l (a7)+,xxp_Help(a4)
  3829.  rts
  3830.  
  3831. .info:                     ;view info req
  3832.  bsr.s .infd
  3833.  bra .rqwt
  3834.  
  3835. .infd:                     ;do info req - type 3
  3836.  bsr .back
  3837.  move.l xxp_Help(a4),-(a7)
  3838.  clr.l xxp_Help(a4)
  3839.  moveq #31,d0
  3840.  moveq #6,d1
  3841.  moveq #3,d2
  3842.  bsr TLReqinfo
  3843.  move.l (a7)+,xxp_Help(a4)
  3844.  rts
  3845.  
  3846. .inf1:                     ;do info req - type 1
  3847.  bsr .back
  3848.  move.l xxp_Help(a4),-(a7)
  3849.  clr.l xxp_Help(a4)
  3850.  moveq #98,d0
  3851.  moveq #3,d1
  3852.  moveq #1,d2
  3853.  bsr TLReqinfo
  3854.  move.l (a7)+,xxp_Help(a4)
  3855.  rts
  3856.  
  3857. .inf2:                     ;do info req - type 2
  3858.  bsr .back
  3859.  move.l xxp_Help(a4),-(a7)
  3860.  clr.l xxp_Help(a4)
  3861.  moveq #101,d0
  3862.  moveq #3,d1
  3863.  moveq #2,d2
  3864.  bsr TLReqinfo
  3865.  move.l (a7)+,xxp_Help(a4)
  3866.  rts
  3867.  
  3868. .prog:                     ;view progress bar
  3869.  bsr.s .prgd
  3870.  bra .rqwt
  3871.  
  3872. .prgd:                     ;do progress bar
  3873.  bsr .back
  3874.  
  3875.  moveq #41,d0              ;make TLData window to hold progress bar
  3876.  moveq #5,d1
  3877.  bsr TLData
  3878.  
  3879.  moveq #0,d0
  3880.  moveq #0,d1
  3881.  moveq #0,d2
  3882.  bsr TLNewfont
  3883.  move.l xxp_AcWind(a4),a5
  3884.  clr.w xxp_RTspc(a5)
  3885.  
  3886.  move.l #6,xxp_prgd(a4)    ;set up TLProgress
  3887.  move.l #26,xxp_prgd+4(a4)
  3888.  move.l #96,xxp_prgd+8(a4)
  3889.  move.l #10,xxp_prgd+12(a4)
  3890.  
  3891.  bsr TLBusy
  3892.  moveq #0,d0               ;do for 0-50
  3893.  moveq #50,d1
  3894.  moveq #-1,d2
  3895.  move.l xxp_gfxb(a4),a6
  3896. .pgcc:
  3897.  jsr TLProgress
  3898.  movem.l d0-d2,-(a7)
  3899.  moveq #3,d2               ;inc d2 to make slower
  3900. .pgwt:
  3901.  jsr _LVOWaitTOF(a6)
  3902.  dbra d2,.pgwt
  3903.  movem.l (a7)+,d0-d2
  3904.  addq.l #1,d0
  3905.  cmp.w #51,d0
  3906.  bne .pgcc
  3907.  moveq #15,d2               ;pause at end
  3908. .pgp1:
  3909.  jsr _LVOWaitTOF(a6)
  3910.  dbra d2,.pgp1
  3911.  bsr TLUnbusy
  3912.  
  3913.  bsr TLReqoff
  3914.  rts
  3915.  
  3916. .data:                     ;view data window
  3917.  bsr.s .datd
  3918.  bra .rqwt
  3919.  
  3920. .datd:                     ;do data window
  3921.  bsr .back
  3922.  moveq #37,d0
  3923.  moveq #4,d1
  3924.  bsr TLData
  3925.  bsr TLBusy
  3926.  move.l xxp_gfxb(a4),a6
  3927.  move.w #200,d2
  3928. .datw:
  3929.  jsr _LVOWaitTOF(a6)
  3930.  subq.w #1,d2
  3931.  bne .datw
  3932.  bsr TLUnbusy
  3933.  bsr TLReqoff
  3934.  rts
  3935.  
  3936. .show:                     ;view show req
  3937.  bsr.s .shwd
  3938.  bra .rqwt
  3939.  
  3940. .shwd:                     ;do dhow rea
  3941.  bsr .back
  3942.  move.l xxp_Help(a4),-(a7)
  3943.  clr.l xxp_Help(a4)
  3944.  moveq #46,d0
  3945.  moveq #120,d1
  3946.  moveq #10,d2
  3947.  bset #31,d2
  3948.  moveq #0,d3
  3949.  lea .shhk,a0
  3950.  bsr TLReqshow
  3951.  move.l (a7)+,xxp_Help(a4)
  3952.  rts
  3953.  
  3954. .shhk:                     ;** hook for view TLReqshow
  3955.  move.l a4,a0
  3956.  move.l #'Stri',(a0)+
  3957.  move.l #'ng  ',(a0)+      ;line = 'String  ....'
  3958.  bsr TLHexasc
  3959.  clr.b (a0)
  3960.  move.l a4,a0
  3961.  rts
  3962.  
  3963. .palt:                     ;palette box clicked
  3964.  tst.l xxp_ypsz(a7)
  3965.  bmi.s .pltc               ;go if permitted
  3966.  moveq #47,d0
  3967.  moveq #1,d1
  3968.  moveq #0,d2
  3969.  bsr TLReqinfo             ;else report forbidden
  3970.  bra .wait
  3971. .pltc:
  3972.  moveq #2,d0               ; 2 = choose palette only
  3973.  move.l xxp_Help(a4),-(a7)
  3974.  clr.l xxp_Help(a4)
  3975.  bsr TLReqcolor
  3976.  move.l (a7)+,xxp_Help(a4)
  3977.  bra .wait
  3978.  
  3979. .bots:                     ;save/use/canc clicked
  3980.  cmp.w #118,d1
  3981.  bcc .canc                 ;go if cancel
  3982.  moveq #0,d7
  3983.  cmp.w #59,d1
  3984.  bcc.s .use                ;go if use (d7 = 0)
  3985.  moveq #-1,d7              ;else save (d7 = -1)
  3986. .use:
  3987.  
  3988.  moveq #24,d0              ;create ENV:Tandem & ENVARC:Tandem if necessary
  3989.  bsr TLStra0
  3990.  move.l d7,d0
  3991.  bsr TLPrefdir
  3992.  moveq #25,d0              ;save prefs in ENV:Tandem/GUI [+ ENVARC: if save]
  3993.  bsr TLStra0
  3994.  move.l d7,d0
  3995.  move.l xxp_pref(a4),d2
  3996.  move.l #xxp_ypsz,d3
  3997.  bsr TLPreffil
  3998.  bsr .back
  3999.  
  4000.  moveq #64,d0              ;report Use/Save consequences
  4001.  moveq #10,d1
  4002.  moveq #0,d2
  4003.  bsr TLReqinfo
  4004.  bra.s .wrap
  4005.  
  4006. .canc:                     ;cancel
  4007.  move.l a7,a0
  4008.  move.l xxp_pref(a4),a1
  4009.  moveq #(xxp_ypsz/4)-1,d0
  4010. .keep:
  4011.  move.l (a0)+,(a1)+        ;restore aboriginal contents to xxp_pref
  4012.  dbra d0,.keep
  4013.  move.l xxp_pref(a4),a0    ;restore aboriginal pref font to font 9
  4014.  moveq #9,d0
  4015.  move.w xxp_yhgt(a0),d1
  4016.  bsr TLGetfont
  4017.  add.w #xxp_yfsh,a0        ;restore aboriginal show data font to font 8
  4018.  moveq #8,d0
  4019.  moveq #8,d1
  4020.  bsr TLGetfont
  4021.  
  4022. .wrap:
  4023.  move.w xxp_Active(a4),d0  ;close the Prefs window
  4024.  bsr TLWsub
  4025.  tst.l xxp_errn(a4)        ;go if no error
  4026.  beq.s .done
  4027.  
  4028. .bad:                      ;report error in monitor & if possible choose req
  4029.  bsr TLError
  4030.  
  4031. .done:                     ;close down
  4032.  add.w #xxp_ypsz+4,a7
  4033.  move.l (a7)+,xxp_Help(a4)
  4034.  move.l (a7)+,d0           ;retrieve calling active window in lsw
  4035.  tst.w d0
  4036.  bmi.s .quit               ;go if none
  4037.  bsr TLWpop                ;pop calling window
  4038.  move.l xxp_pref(a4),a0
  4039.  moveq #10,d0              ;attach xxp_pref font to req fonts data
  4040.  moveq #0,d1
  4041.  move.b xxp_ysty(a0),d1
  4042.  moveq #1,d2
  4043.  bsr TLNewfont
  4044.  moveq #0,d0
  4045.  move.b xxp_yspc(a0),d0
  4046.  move.l xxp_AcWind(a4),a0
  4047.  move.w d0,xxp_RTspc(a0)
  4048. .quit:
  4049.  bsr TLWslof
  4050.  move.l (a7)+,xxp_strg(a4) ;retrieve global strings
  4051.  movem.l (a7)+,d0-d7/a0-a6 ;xxp_errn<>0 if bad
  4052.  rts
  4053.  
  4054. .back:                     ;** prefs window to back
  4055.  movem.l d0-d1/a0-a1/a6,-(a7)
  4056.  move.l xxp_intb(a4),a6
  4057.  move.l xxp_AcWind(a4),a5
  4058.  move.l xxp_Window(a5),a0
  4059.  jsr _LVOWindowToBack(a6)
  4060.  movem.l (a7)+,d0-d1/a0-a1/a6
  4061.  rts
  4062.  
  4063. .str: dc.b 0
  4064.  dc.b 'GUI Preferences      ',0 ;1
  4065.  dc.b 'Choose requester     ',0 ;2
  4066.  dc.b 'Input requester      ',0 ;3
  4067.  dc.b 'Info requester       ',0 ;4
  4068.  dc.b 'Progress bar         ',0 ;5
  4069.  dc.b 'Data window          ',0 ;6
  4070.  dc.b 'Show requester       ',0 ;7
  4071.  dc.b '                     ',0 ;8
  4072.  dc.b 'Colour palette       ',0 ;9
  4073.  dc.b 'View all reqs &c     ',0 ;10
  4074.  dc.b ' Save    Use   Cancel',0 ;11
  4075.  
  4076.  dc.b 'Background pen       ',0 ;12
  4077.  dc.b 'Title pen            ',0 ;13
  4078.  dc.b 'Text pen             ',0 ;14
  4079.  dc.b 'Horizontal gaps      ',0 ;15
  4080.  dc.b 'Vertical gaps        ',0 ;16
  4081.  dc.b 'Font name,size       ',0 ;17
  4082.  dc.b '     style           ',0 ;18
  4083.  dc.b '     space           ',0 ;19
  4084.  dc.b 'Factory settings     ',0 ;20
  4085.  dc.b '   View        OK    ',0 ;21
  4086.  dc.b 'Progress pen         ',0 ;22
  4087.  dc.b 'Data font            ',0 ;23
  4088.  dc.b 'Tandem',0 ;24
  4089.  dc.b 'Tandem/GUI',0 ;25
  4090.  dc.b '                     ',0 ;26
  4091.  dc.b 'I''m a Choose Requester',0 ;27
  4092.  dc.b 'Choice 1',0 ;28
  4093.  dc.b 'Choice 2',0 ;29
  4094.  dc.b 'I''m an Input Requester',0 ;30
  4095.  dc.b 'I''m a type 3 info window...',0 ;31
  4096.  dc.b 'Type 1 has just an OK button,',0 ;32
  4097.  dc.b 'Type 2 has OK + Cancel buttons.',0 ;33
  4098.  dc.b 'Type 3 or more custom buttons.',0 ;34
  4099.  dc.b 'As you see below, I have 6.',0 ;35
  4100.  dc.b '£\!!\!?\?!\??\$',0 ;36
  4101.  dc.b 'I''m a data window...',0 ;37
  4102.  dc.b 'I''ll sit here a couple of',0 ;38
  4103.  dc.b 'seconds, and then I''ll',0 ;39
  4104.  dc.b 'disappear...',0 ;40
  4105.  dc.b 'Hereon is a progress bar...',0 ;41
  4106.  dc.b ' ',0 ;42
  4107.  dc.b ' ',0 ;43
  4108.  dc.b ' ',0 ;44
  4109.  dc.b ' ',0 ;45
  4110.  dc.b 'I''m a show requester',0 ;46
  4111.  dc.b 'Can''t alter palette: this option is currently disabled',0 ;47
  4112.  dc.b 'Selecting a font....',0 ;48
  4113.  dc.b 'The font you select will apply to all of these',0 ;49
  4114.  dc.b 'requester &c types:',0 ;50
  4115.  dc.b ' ',0 ;51
  4116.  dc.b '  Choose requester',0 ;52
  4117.  dc.b '  Input requester',0 ;53
  4118.  dc.b '  Info requester',0 ;54
  4119.  dc.b '  Data window',0 ;55
  4120.  dc.b 'Error: can''t open ASL requester (out of memory?)',0 ;56
  4121.  dc.b 'Caution: can''t open font selected - probably memory shortage.',0 ;57
  4122.  dc.b 'Suggest you save prefs, then close unnecessary tasks or reboot.',0
  4123.  dc.b 'Else when you view requesters, they may not manifest the new font.',0
  4124.  dc.b 'Hopefully....',0 ;60
  4125.  dc.b 'The new font is visible',0 ;61
  4126.  dc.b 'on this info requester.',0 ;62
  4127.  dc.b ' ',0 ;63
  4128.  dc.b 'Save/Use selected...',0 ;64
  4129.  dc.b 'Your new preferences will',0 ;65
  4130.  dc.b 'be available to the window',0 ;66
  4131.  dc.b '(if any) which caused this',0 ;67
  4132.  dc.b 'setting of prefs to occur,',0 ;68
  4133.  dc.b 'along with windows opened',0 ;69
  4134.  dc.b 'under tandem.library from',0 ;70
  4135.  dc.b 'now on. Of course, some',0 ;71
  4136.  dc.b 'programs will sometimes',0 ;72
  4137.  dc.b 'override the preferences.',0 ;73
  4138.  dc.b 'You are invited to set preferences for tandem.library....',0 ;74
  4139.  dc.b 'The program that invoked this requester is running a library',0 ;75
  4140.  dc.b 'called "tandem.library". The program may well cause the',0 ;76
  4141.  dc.b 'following sorts of things to appear:',0 ;77
  4142.  dc.b ' ',0 ;78
  4143.  dc.b '  Choose requesters  used for selecting among alternatives.',0 ;79
  4144.  dc.b '  Input requesters   used for getting you to input data.',0 ;80
  4145.  dc.b '  Info requesters    used to tell you data, and perhaps',0 ;81
  4146.  dc.b '                     make a decision (this is an info requester).',0
  4147.  dc.b '  Progress bars      to report progress while the program is busy.',0
  4148.  dc.b '  Data windows       to put up data, etc. for your perusal.',0 ;84
  4149.  dc.b '  Show requesters    to allow you to see dynamically constructed',0
  4150.  dc.b '                     data, and scroll & seek among it.',0 ;86
  4151.  dc.b ' ',0 ;87
  4152.  dc.b 'After you click "OK" (below), you can choose to alter the look of',0
  4153.  dc.b 'any of the above, and also to adjust this screen"s colour palette.',0
  4154.  dc.b 'You can set colour pens for the requesters, and "horz gaps" and',0
  4155.  dc.b '"Vert gaps" to adjust their setting out, and also choose a font,',0
  4156.  dc.b 'font style and character spacing for their text. (n.b. not all',0
  4157.  dc.b 'programs respect your prefs at all times). When you are setting',0
  4158.  dc.b 'prefs for a requester &c. type, you can click "View" to see how it',0
  4159.  dc.b 'looks so far. When all done, click "Use", "Save" or "Cancel".',0 ;95
  4160.  dc.b 'Can''t do GUI prefs - too many system resources in use',0 ;96
  4161.  dc.b 'Type 2 choose requester - 1 line of dynamic info',0 ;97
  4162.  dc.b 'Type 1 info requester...',0 ;98
  4163.  dc.b 'Lines of data and',0 ;99
  4164.  dc.b 'and OK button',0 ;100
  4165.  dc.b 'Type 2 info requester...',0 ;101
  4166.  dc.b 'Lines of data and',0 ;102
  4167.  dc.b 'OK and Cancel buttons',0 ;103
  4168.  dc.b 'Choose a pen for...',0 ;104
  4169.  dc.b 'When color requester appears, click whichever color.',0 ;105
  4170.  dc.b 'It will then appear at the bottom of the requester.',0 ;106
  4171.  dc.b 'Finally, click Use or Cancel.',0 ;107
  4172.  dc.b 'Selecting a font style...',0 ;108
  4173.  dc.b 'The style you select will apply to all of:',0 ;109
  4174.  dc.b ' ',0 ;110
  4175.  dc.b '  Choose requester',0 ;111
  4176.  dc.b '  Input requester',0 ;112
  4177.  dc.b '  Info requester',0 ;113
  4178.  dc.b '  Data window',0 ;114
  4179.  dc.b 'Setting a text spacing...',0 ;115
  4180.  dc.b 'the spacing you choose will apply ot all of:',0 ;116
  4181.  dc.b ' ',0 ;117
  4182.  dc.b '  Choose requester',0 ;118
  4183.  dc.b '  Input requester',0 ;119
  4184.  dc.b '  Info requester',0 ;120
  4185.  dc.b '  Data window',0 ;121
  4186.  dc.b 'Select font style:',0 ;122
  4187.  dc.b 'Plain',0 ;123
  4188.  dc.b 'Bold',0 ;124
  4189.  dc.b 'Italic',0 ;125
  4190.  dc.b 'Bold + Italic',0 ;126
  4191.  dc.b 'Cancel',0 ;127
  4192.  dc.b 'Text spacing (0-9, usually 0 for small fonts)',0 ;128
  4193.  dc.b 'Specify horizontal gap (0-9, usally 2)',0 ;129
  4194.  dc.b 'Specify vertical gap (0-9, usually 1)',0 ;130
  4195.  dc.b 'Specify show requester font',0 ;131
  4196.  dc.b 'The font height will always be 8. Only choose',0 ;132
  4197.  dc.b 'fonts narrower than Topaz/8, not proportional.',0 ;133
  4198.  dc.b 'Or, for maximum readability, choose Topaz/8.',0 ;134
  4199.  dc.b 'Error: can''t open the show requester data font',0 ;135
  4200.  dc.b 'Error: you have chosen a proportional font.',0 ;136
  4201.  dc.b 'Show requesters will not use the font you have chosen.',0 ;137
  4202.  dc.b 'Set all tandem.library prefs to factory settings...',0 ;138
  4203.  dc.b 'Caution: ALL existing preferences will be over-written.',0 ;139
  4204.  
  4205.  ds.w 0
  4206.  
  4207. .fact:                     ;factory pref settings
  4208.  dc.b 'topaz.font',0,0     ;req font
  4209.  dc.l 0,0,0,0,0
  4210.  dc.w 8                    ;ht=8
  4211.  dc.b 0,0                  ;styl=0, spac=0
  4212.  dc.b 'topaz.font',0,0     ;show data font
  4213.  dc.l 0,0,0,0,0
  4214.  dc.b 3,2,1,2,1,0,0,0      ;choose: pens 3,2,1; gaps 2,1
  4215.  dc.b 3,2,1,2,1,0,0,0      ;input
  4216.  dc.b 3,2,1,2,1,0,0,0      ;info
  4217.  dc.b 0,0,1,3,0,0,0,0      ;prog pens 0,,1,3
  4218.  dc.b 3,2,1,0,0,0,0,0      ;data
  4219.  dc.b 3,2,1,0,0,0,0,0      ;show
  4220.  
  4221. *>>>> put string D0 in buff, set d0 to bytes transferred
  4222. TLStrbuf:
  4223.  movem.l a0-a1,-(a7) ;saves all regs except D0
  4224.  bsr TLStra0
  4225.  move.l a4,a1
  4226.  moveq #-1,d0        ;(byte count excludes null delimiter)
  4227. .tfr:
  4228.  addq.l #1,d0
  4229.  move.b (a0)+,(a1)+
  4230.  bne .tfr
  4231.  movem.l (a7)+,a0-a1
  4232.  rts
  4233.  
  4234. *>>>> point A0 to string D0
  4235. TLStra0:
  4236.  move.l d0,-(a7) ;saves all except A0
  4237.  move.l xxp_strg(a4),a0
  4238.  subq.w #1,d0
  4239. .seek:
  4240.  tst.b (a0)+
  4241.  bne .seek
  4242.  dbra d0,.seek
  4243.  move.l (a7)+,d0
  4244.  rts
  4245.  
  4246. *>>>> call IoErr, DOS number to D0, call Fault to put error report in buff
  4247.  
  4248. ; 1. Sends DOS error report (if <>0) to output stream
  4249. ; 2. Puts meaning of xxp_errn in buff (n.b. xxp_errn = 0 = "Cancelled")
  4250. ; 3. If xxp_errn<>0, sends buff to output stream
  4251. ;    (useful if out of chip ram, since at least monitor shows it)
  4252. ; 4. Returns DOS error number from step 1. in D0
  4253.  
  4254. TLError:
  4255.  movem.l d0-d4/a0-a1/a6,-(a7) ;saves all regs except D0
  4256.  move.l xxp_dosb(a4),a6
  4257.  jsr _LVOIoErr(a6)         ;D0=error number
  4258.  move.l d0,(a7)            ;put error number in return D0
  4259.  beq.s .errn               ;don't report if = 0
  4260.  move.l d0,d1
  4261.  moveq #0,d2
  4262.  move.l a4,d3
  4263.  moveq #80,d4
  4264.  jsr _LVOFault(a6)         ;DOS error report to buff if <>
  4265.  bsr TLOutput              ;send to output stream
  4266. .errn:
  4267.  clr.b (a4)                ;return null in (a4) if bad error number
  4268.  move.l xxp_errn(a4),d0
  4269. .last:
  4270.  cmp.w #42,d0
  4271.  bcc.s .wrap
  4272.  lea .errs,a0              ;find xxp_errn'th entry in table
  4273. .nern:
  4274.  tst.b (a0)+
  4275.  bne .nern
  4276.  dbra d0,.nern
  4277.  move.l a4,a1              ;tfr to buff
  4278.  move.l #'Erro',(a1)+
  4279.  move.w #'r ',(a1)+
  4280. .tfr:
  4281.  move.b (a0)+,(a1)+
  4282.  bne .tfr
  4283.  tst.l xxp_errn(a4)        ;put in error stream, unless errn = 0
  4284.  beq.s .wrap
  4285.  bsr TLOutput
  4286. .wrap:
  4287.  movem.l (a7)+,d0-d4/a0-a1/a6
  4288.  rts
  4289.  
  4290. ;tandem error codes
  4291. .errs: dc.b 0
  4292.  dc.b '0  Cancel selected',0
  4293.  dc.b '1  Out of Public memory',0
  4294.  dc.b '2  Out of chip memory',0
  4295.  dc.b '3  Can''t open file for reading',0
  4296.  dc.b '4  Can''t open file for writing',0
  4297.  dc.b '5  Can''t read file',0
  4298.  dc.b '6  Can''t write file',0
  4299.  dc.b '7  Can''t lock public screen',0
  4300.  dc.b '8  Font operation failed - Can''t open diskfont.library',0
  4301.  dc.b '9  Can''t get screen vi for gadtools.library',0
  4302.  dc.b '10  Can''t open font',0
  4303.  dc.b '11  Object won''t fit in window',0
  4304.  dc.b '12  Can''t open half-height font (super/sub script)',0
  4305.  dc.b '13  Can''t make double width font - Can''t create FONTS:Temporary',0
  4306.  dc.b '14  Can''t make double width font - Can''t open FONTS:Temporary',0
  4307.  dc.b '15  Can''t make dble width font - Can''t write to FONTS:Temporary',0
  4308.  dc.b '16  Can''t make double width font - NewFontContents failed',0
  4309.  dc.b '17  Font operation failed - Can''t lock FONTS:',0
  4310.  dc.b '18  Can''t make double width font - Can''t open Temporary.font',0
  4311.  dc.b '19  Can''t make double width font - Can''t write to Temporary.font',0
  4312.  dc.b '20  Can''t make double width font - Can''t re-open Temporary.font',0
  4313.  dc.b '21  Requester won''t fit in screen/window',0
  4314.  dc.b '22  Needs intuition.library v. 39+ (Amiga OS release 3.0+)',0
  4315.  dc.b '23  Can''t create a prefs dir',0
  4316.  dc.b '24  Can''t create a prefs file',0
  4317.  dc.b '25  Can''t open ILBM file',0
  4318.  dc.b '26  Not an IFF file',0
  4319.  dc.b '27  Not an ILBM file',0
  4320.  dc.b '28  Garbled ILBM contents',0
  4321.  dc.b '29  Unrecognised ILBM compression method',0
  4322.  dc.b '30  LayoutMenusA failed (unlikely)',0
  4323.  dc.b '31  Edit error - window too narrow',0
  4324.  dc.b '32  Edit error - window too shallow',0
  4325.  dc.b '33  Edit error - can''t obey fixed offset',0
  4326.  dc.b '34  Edit error - can''t attach font',0
  4327.  dc.b '35  Operation cancelled because window resized',0
  4328.  dc.b '36  Can''t make screen rendering objects (out of memory)',0
  4329.  dc.b '37  Can''t get screen DrawInfo (out of memory)',0
  4330.  dc.b '38  Can''t make window scroller rendering object (out of mem)',0
  4331.  dc.b '39  Can''t put up font selector - too many windows already opened',0
  4332.  dc.b '40  Can''t open printer device',0
  4333.  dc.b '41  Error in sending characters to printer',0
  4334.  
  4335. ; set D0 at .last to highest legal error number + 1
  4336.  
  4337.  ds.w 0
  4338.  
  4339. *>>>> open a file for reading
  4340. TLOpenread:
  4341.  movem.l d1-d2/a0-a1/a6,-(a7) ;save all except d0
  4342.  clr.l xxp_errn(a4)
  4343.  move.l xxp_dosb(a4),a6
  4344.  move.l a4,d1
  4345.  move.l #MODE_OLDFILE,d2
  4346.  jsr _LVOOpen(a6)
  4347.  move.l d0,xxp_hndl(a4)    ;sv handle
  4348.  bne.s .done
  4349.  addq.l #3,xxp_errn(a4)
  4350.  moveq #0,d0
  4351. .done:
  4352.  movem.l (a7)+,d1-d2/a0-a1/a6 ;EQ, D0=0 if bad
  4353.  rts
  4354.  
  4355. *>>>> open a file for writing
  4356. TLOpenwrite:
  4357.  movem.l d1-d2/a0-a1/a6,-(a7) ;save all except d0
  4358.  clr.l xxp_errn(a4)
  4359.  move.l xxp_dosb(a4),a6
  4360.  move.l a4,d1
  4361.  move.l #MODE_NEWFILE,d2
  4362.  jsr _LVOOpen(a6)
  4363.  move.l d0,xxp_hndl(a4)     ;sv handle
  4364.  bne.s .done
  4365.  addq.l #4,xxp_errn(a4)
  4366.  moveq #0,d0
  4367. .done:
  4368.  movem.l (a7)+,d1-d2/a0-a1/a6 ;EQ, D0=0 if bad
  4369.  rts
  4370.  
  4371. *>>>> write D3 bytes at (D2) to xxp_hndl; Error called if bad
  4372. TLWritefile:
  4373.  movem.l d1/a0-a1/a6,-(a7) ;saves all except D0
  4374.  clr.l xxp_errn(a4)        ;errn=0 if no error
  4375.  move.l xxp_dosb(a4),a6
  4376.  move.l xxp_hndl(a4),d1
  4377.  jsr _LVOWrite(a6)
  4378.  cmp.l d0,d3               ;bad if bytes written <> D3
  4379.  beq.s .done
  4380.  bsr TLClosefile           ;(closefile if bad)
  4381.  addq.l #6,xxp_errn(a4)
  4382. .done:
  4383.  tst.l xxp_errn(a4)
  4384.  eori.w #-1,ccr
  4385.  movem.l (a7)+,d1/a0-a1/a6 ;EQ, errn<>0 if bad, D0 = bytes written
  4386.  rts
  4387.  
  4388. *>>>> read max D3 bytes to (D2) from xxp_hndl; sets D0=bytes read; EQ if bad
  4389. TLReadfile:
  4390.  movem.l d1/a0-a1/a6,-(a7) ;save all except D0
  4391.  clr.l xxp_errn(a4)        ;errn=0 if no error
  4392.  move.l xxp_dosb(a4),a6
  4393.  move.l xxp_hndl(a4),d1
  4394.  jsr _LVORead(a6)
  4395.  tst.l d0
  4396.  bge.s .done               ;D0=bytes read (if D0=0, eof, treat as good)
  4397.  bsr TLClosefile           ;(closefile if bad)
  4398.  addq.l #5,xxp_errn(a4)
  4399.  moveq #0,d0
  4400. .done:
  4401.  tst.l xxp_errn(a4)
  4402.  eori.w #-1,ccr
  4403.  movem.l (a7)+,d1/a0-a1/a6 ;EQ, errn<> if bad, else D0 = bytes read
  4404.  rts
  4405.  
  4406. *>>>> close file
  4407. TLClosefile:
  4408.  movem.l d0-d1/a0-a1/a6,-(a7) ;save all regs
  4409.  move.l xxp_dosb(a4),a6
  4410.  move.l xxp_hndl(a4),d1
  4411.  beq.s .done               ;can call if xxp_hndl=0
  4412.  jsr _LVOClose(a6)
  4413.  clr.l xxp_hndl(a4)        ;sets hndl=0
  4414. .done:
  4415.  movem.l (a7)+,d0-d1/a0-a1/a6
  4416.  rts
  4417.  
  4418. *>>>> ASCII to hex conversion (unsigned double integer)
  4419. ; does not check for CS if >$FFFFFFFF; not highly optimised
  4420. ; Call: A0=string addr (if no number there A0 returns unchanged, D0=0)
  4421. ; value in D0  A0 points to 1st non-numeric chr
  4422. TLAschex:
  4423.  move.l d1,-(a7) ;save all except D0,A0
  4424. .spcs:
  4425.  cmp.b #' ',(a0)+ ;skip leading spaces
  4426.  beq .spcs
  4427.  subq.l #1,a0
  4428.  clr.l d0
  4429.  clr.l d1
  4430. .chr:
  4431.  move.b (a0)+,d1 ;get next character
  4432.  sub.b #'0',d1   ;(stop if not 0-9)(only works for unsigned integers)
  4433.  bcs.s .eoe
  4434.  cmp.b #10,d1
  4435.  bcc.s .eoe
  4436.  move.l d0,-(a7)
  4437.  lsl.l #2,d0
  4438.  add.l (a7)+,d0 ;result is modulo $100000000
  4439.  lsl.l #1,d0
  4440.  add.l d1,d0
  4441.  bra .chr
  4442. .eoe:
  4443.  subq.l #1,a0   ;a0 points to delimiter
  4444.  move.l (a7)+,d1
  4445.  rts
  4446.  
  4447. *>>>> hex to ASCII conversion (unsigned double integer left justified)
  4448. ; not highly optimised for small values
  4449. ; Call: value in D0; A0 is where to put result
  4450. ; Back: A0 points past last character
  4451. TLHexasc:
  4452.  movem.l a1/d0-d4,-(a7) ;save all except A0
  4453.  moveq #1,d4
  4454.  moveq #0,d3     ;d3<>0 after 1st non-zero chr sent
  4455.  lea .k,a1
  4456.  move.l (a1)+,d1 ;d1=next decimal digit, starting 1E9
  4457. .digt:
  4458.  moveq #'0'-1,d2 ;d2 holds ascii of next digit
  4459. .bump:
  4460.  addq.b #1,d2
  4461.  sub.l d1,d0
  4462.  bcc .bump
  4463.  add.l d1,d0     ;d0=remainder so far
  4464.  tst.w d3
  4465.  bne.s .send     ;if chr(s) already sent, send even if 0
  4466.  cmp.b #'0',d2   ;else don't send
  4467.  beq.s .next
  4468.  moveq #-1,d3    ;remember that we have sent
  4469. .send:
  4470.  move.b d2,(a0)+ ;send a digit
  4471. .next:
  4472.  move.l (a1)+,d1 ;get next decimal digit
  4473.  cmp.l d4,d1
  4474.  bgt .digt       ;go if >1E0
  4475.  bne.s .done     ;quit if 0 (delimiter)
  4476.  moveq #-1,d3    ;if sending last digit, for to send, even if none sent yet
  4477.  bra .digt
  4478. .done:
  4479.  movem.l (a7)+,a1/d0-d4
  4480.  rts
  4481.  
  4482. .k: dc.l 1000000000,100000000,10000000,1000000,100000,10000,1000,100,10,1,0
  4483.  
  4484. *>>>> output from buff to output handle (temporarily append $0A)
  4485. TLOutput:
  4486.  movem.l d1-d3/a0-a1/a6,-(a7) ;save all registers except D0
  4487.  move.l xxp_dosb(a4),a6
  4488.  move.l xxp_oput(a4),d1
  4489.  move.l a4,d2              ;D2=buff
  4490.  move.l d2,a0              ;count bytes
  4491. .eos:
  4492.  tst.b (a0)+               ;find end of string
  4493.  bne .eos
  4494.  move.b #$0A,-1(a0)        ;replace its 0 with a $0A
  4495.  move.l a0,d3
  4496.  sub.l d2,d3               ;D3=chrs to be sent
  4497.  jsr _LVOWrite(a6)
  4498.  add.l d2,d3               ;restore the 0
  4499.  move.l d3,a0
  4500.  clr.b -(a0)
  4501.  movem.l (a7)+,d1-d3/a0-a1/a6 ;D0 = value returned by _LVOWrite
  4502.  rts
  4503.  
  4504. *>>>> input from input handle to buff; null delimit - i.e. chop off $0A
  4505. TLInput:
  4506.  movem.l d1-d3/a0-a1/a6,-(a7) ;save all except d0
  4507.  move.l xxp_dosb(a4),a6
  4508.  move.l xxp_iput(a4),d1
  4509.  move.l a4,d2                 ;D2=buff
  4510.  move.l #500,d3               ;D3=max input (will be much less,surely)
  4511.  jsr _LVORead(a6)
  4512.  tst.l d0
  4513.  ble.s .done
  4514.  move.l d2,a0
  4515.  clr.b -1(a0,d0.w)            ;null delimit if D0>0 (i.e. chop off $0A)
  4516. .done:
  4517.  movem.l (a7)+,d1-d3/a0-a1/a6 ;d0=value returned by Read (characters+1)
  4518.  rts
  4519.  
  4520. *>>>> create D0 bytes of public memory
  4521. TLPublic:
  4522.  movem.l d1/a0-a1/a6,-(a7) ;save all except d0
  4523.  move.l xxp_intb(a4),a6
  4524.  move.l #MEMF_PUBLIC,d1
  4525.  move.l a4,a0
  4526.  add.l #xxp_memk,a0
  4527.  jsr _LVOAllocRemember(a6) ;(Front.i will finally call FreeRemember)
  4528.  tst.l d0
  4529.  movem.l (a7)+,d1/a0-a1/a6 ;D0=address; 0 if out of mem
  4530.  rts
  4531.  
  4532. *>>>> create D0 bytes of chip memory
  4533. TLChip:
  4534.  movem.l d1/a0-a1/a6,-(a7) ;save all except d0
  4535.  move.l xxp_intb(a4),a6
  4536.  move.l #MEMF_CHIP,d1
  4537.  move.l a4,a0
  4538.  add.l #xxp_memk,a0
  4539.  jsr _LVOAllocRemember(a6) ;(Front.i will finally call FreeRemember)
  4540.  tst.l d0
  4541.  movem.l (a7)+,d1/a0-a1/a6 ;D0=address; 0 if out of mem
  4542.  rts
  4543.  
  4544. *>>>> CD to program's progdir
  4545. TLProgdir:
  4546.  movem.l d0-d1/a0-a1/a6,-(a7)
  4547.  move.l xxp_dosb(a4),a6
  4548.  jsr _LVOGetProgramDir(a6)
  4549.  move.l d0,d1
  4550.  jsr _LVOCurrentDir(a6)
  4551.  movem.l (a7)+,d0-d1/a0-a1/a6
  4552.  rts
  4553.  
  4554. *>>>> get IDCMP from xxp_Window [xxp_Active must be GE]
  4555. TLKeyboard:
  4556.  movem.l a0-a1/a5-a6,-(a7)  ;saves all except d0-d3
  4557.  move.l xxp_AcWind(a4),a5   ;a5=current window in WSuite
  4558. .get:
  4559.  move.l xxp_Window(a5),a1   ;get popped window
  4560.  move.l wd_UserPort(a1),a0
  4561.  move.l xxp_sysb(a4),a6
  4562.  jsr _LVOWaitPort(a6)       ;wait for IDCMP
  4563.  bsr TLMget                 ;get & process
  4564.  tst.l d0
  4565.  beq .get                   ;retry if null (can't happen?)
  4566.  movem.l (a7)+,a0-a1/a5-a6
  4567.  rts
  4568.  
  4569. *>>>> get window message (if any) from window a1
  4570. TLMmess:
  4571.  movem.l a0-a1/a6,-(a7)    ;save all except results in D0-D4
  4572.  move.l xxp_gadb(a4),a6
  4573.  move.l wd_UserPort(a1),a0
  4574.  jsr _LVOGT_GetIMsg(a6)    ;get IDCMP
  4575.  tst.l d0
  4576.  beq.s .done               ;go if none
  4577.  move.l d0,a0
  4578.  move.l xxp_mesg(a4),a1
  4579.  moveq #im_SIZEOF-1,d1
  4580. .cach:
  4581.  move.b (a0)+,(a1)+        ;keep copy of message in xxp_mesg
  4582.  dbra d1,.cach
  4583.  move.l d0,a1
  4584.  move.l im_Class(a1),d4    ;d4=class
  4585.  moveq #0,d0               ;d0=code
  4586.  moveq #0,d1               ;d1=mousex
  4587.  moveq #0,d2               ;d2=mousey
  4588.  moveq #0,d3               ;d3=qualifier
  4589.  move.w im_Code(a1),d0
  4590.  move.w im_Qualifier(a1),d3
  4591.  move.w im_MouseX(a1),d1
  4592.  move.w im_MouseY(a1),d2
  4593.  movem.l d0-d1,-(a7)
  4594.  jsr _LVOGT_ReplyIMsg(a6)   ;reply
  4595.  moveq #-1,d0               ;set NE
  4596.  movem.l (a7)+,d0-d1
  4597. .done:
  4598.  movem.l (a7)+,a0-a1/a6     ;EQ if none (else, message in d0-d4)
  4599.  rts
  4600.  
  4601. *>>>> get, reply & process an IDCMP from currently popped (D0=0 if none)
  4602. TLMget:
  4603.  movem.l d4-d7/a0-a6,-(a7)  ;save all exc results in D0-D3
  4604.  move.l xxp_AcWind(a4),a5
  4605.  move.l xxp_Window(a5),a1
  4606.  bsr TLMmess                ;any message?
  4607.  beq .done                  ;no, go (D0=0)
  4608.  btst #1,d3
  4609.  beq.s .shft
  4610.  bset #0,d3                 ;both shifts bit 0
  4611. .shft:
  4612.  btst #5,d3
  4613.  beq.s .alt                 ;both alts bit 4
  4614.  bset #4,d3
  4615. .alt:
  4616.  cmp.l #IDCMP_VANILLAKEY,d4
  4617.  beq .asci
  4618.  cmp.l #IDCMP_RAWKEY,d4
  4619.  beq .rawkey
  4620.  move.l d4,d5
  4621.  and.l #IDCMP_CLOSEWINDOW,d5
  4622.  bne .close
  4623.  move.l d4,d5
  4624.  and.l #IDCMP_IDCMPUPDATE,d5
  4625.  bne .scrl
  4626.  move.l d4,d5
  4627.  and.l #IDCMP_GADGETUP,d5
  4628.  bne .gadup
  4629.  move.l d4,d5
  4630.  and.l #IDCMP_MENUPICK,d5
  4631.  bne .mupik
  4632.  move.l d4,d5
  4633.  and.l #IDCMP_REFRESHWINDOW,d5
  4634.  bne .refresh
  4635.  move.l d4,d5
  4636.  and.l #IDCMP_ACTIVEWINDOW,d5
  4637.  bne .null ;slough active window
  4638.  move.l d4,d5
  4639.  and.l #IDCMP_INACTIVEWINDOW,d5
  4640.  bne .inact
  4641.  move.l d4,d5
  4642.  and.l #IDCMP_NEWSIZE,d5
  4643.  bne .size
  4644.  move.l d4,d5
  4645.  and.l #IDCMP_MOUSEBUTTONS,d5
  4646.  beq .null
  4647.  cmp.w #$68,d0 ;accept only leftmouse down of mousebuttons
  4648.  bne .null
  4649.  move.l #128,d0
  4650.  bra .done
  4651. .asci:
  4652.  and.l #$000000FF,d0
  4653.  cmp.b #$08,d0
  4654.  bne.s .ctrh
  4655.  btst #3,d3   ; 8=bs, unless Ctrl/h
  4656.  beq.s .bs
  4657. .ctrh:
  4658.  cmp.b #$7F,d0
  4659.  beq.s .del
  4660.  cmp.b #$09,d0
  4661.  bne .done
  4662.  btst #3,d3   ; 9=tab, unless Ctrl/i
  4663.  beq.s .tab
  4664.  bra.s .done
  4665. .del:
  4666.  move.b #$8D,d0
  4667.  bra.s .done
  4668. .bs:
  4669.  move.b #$8B,d0
  4670.  bra.s .done
  4671. .tab:
  4672.  move.b #$8C,d0
  4673.  bra.s .done
  4674. .rawkey:
  4675.  and.l #$000000FF,d0  ;rawkey: recycle if keydown or blank keys
  4676.  cmp.b #$5F,d0
  4677.  beq.s .help
  4678.  cmp.b #$4C,d0
  4679.  beq.s .up
  4680.  cmp.b #$4D,d0
  4681.  beq.s .down
  4682.  cmp.b #$4F,d0
  4683.  beq.s .left
  4684.  cmp.b #$4E,d0
  4685.  beq.s .right
  4686.  cmp.b #$50,d0
  4687.  bcs .null
  4688.  cmp.b #$5A,d0
  4689.  bcc .null
  4690.  add.b #$31,d0        ;function keys
  4691.  bra.s .done
  4692. .help:
  4693.  move.b #$92,d0
  4694.  bsr TLHelp
  4695.  moveq #0,d0
  4696.  bra.s .done
  4697. .up:
  4698.  move.b #$8E,d0
  4699.  bra.s .done
  4700. .down:
  4701.  move.b #$8F,d0
  4702.  bra.s .done
  4703. .left:
  4704.  move.b #$91,d0
  4705.  bra.s .done
  4706. .right:
  4707.  move.b #$90,d0
  4708. .done:
  4709.  movem.l (a7)+,d4-d7/a0-a6
  4710.  move.l d0,xxp_kybd(a4)    ;save results in D0-D3, & xxp_kybd+0,4,8,12
  4711.  move.l d1,xxp_kybd+4(a4)
  4712.  move.l d2,xxp_kybd+8(a4)
  4713.  move.l d3,xxp_kybd+12(a4)
  4714.  tst.l d0                  ;EQ if none
  4715.  rts
  4716.  
  4717. .null:
  4718.  moveq #0,d0
  4719.  bra .done
  4720.  
  4721. .close:
  4722.  move.l #$93,d0
  4723.  bra .done
  4724.  
  4725. .gadup:
  4726.  move.l #$94,d0
  4727.  bra .done
  4728.  
  4729. .mupik:
  4730.  move.w d0,d1  ;D1=menu number (-1=none)
  4731.  and.l #31,d1
  4732.  cmp.w #31,d1
  4733.  bne.s .item
  4734.  moveq #-1,d1
  4735. .item:
  4736.  move.w d0,d2  ;D2=item number (-1=none)
  4737.  ror.w #5,d2
  4738.  and.l #63,d2
  4739.  cmp.w #63,d2
  4740.  bne.s .subitem
  4741.  moveq #-1,d2
  4742. .subitem:
  4743.  move.w d0,d3  ;D3=sub-item number (-1=none)
  4744.  rol.w #5,d3
  4745.  and.l #31,d3
  4746.  move.l #$95,d0
  4747.  cmp.w #31,d3
  4748.  bne .done
  4749.  moveq #-1,d3
  4750.  bra .done
  4751.  
  4752. .refresh:
  4753.  tst.l xxp_Refr(a5)           ;get xxp_Refr (=refresh subroutine)
  4754.  beq .null                    ;go if none
  4755.  bsr TLWupdate                ;update window dims
  4756.  bsr TLReqcls
  4757.  movem.l d0-d7/a0-a6,-(a7)    ;call xxp_Refr
  4758.  move.l xxp_Refr(a5),a0
  4759.  jsr (a0)
  4760.  movem.l (a7)+,d0-d7/a0-a6
  4761.  bra .null                 ;& return null if refresh message
  4762.  
  4763. .size:
  4764.  move.l #$96,d0
  4765.  bra .done
  4766.  
  4767. .inact:
  4768.  move.l #$97,d0
  4769.  bra .done
  4770.  
  4771. .scrl:                     ;* here if boopsi - see if scroll, else $99
  4772.  move.l #$98,d0
  4773.  move.l xxp_scrl(a5),d4    ;ignore if no scrollers
  4774.  beq .done
  4775.  move.l d4,a0              ;a0 = scroller data
  4776.  move.l xxp_slid(a4),a1    ;a1 = sys object data
  4777.  move.l xxp_mesg(a4),a2
  4778.  move.l im_Seconds(a2),d4  ;d4,d5 = message time
  4779.  move.l im_Micros(a2),d5
  4780.  sub.l xxp_asec(a1),d4     ;subtract arrival time of prev boopsi
  4781.  sub.l xxp_amic(a1),d5
  4782.  bcc.s .mic0
  4783.  add.l #1000000,d5
  4784.  subq.l #1,d4
  4785. .mic0:
  4786.  sub.l xxp_psec(a1),d4     ;subtract prefs keyboard rept time
  4787.  bcs .null                 ;reject message if before keyboard rept time
  4788.  sub.l xxp_pmic(a1),d5
  4789.  bcc.s .mic1
  4790.  subq.l #1,d4
  4791.  bcs .null
  4792. .mic1:
  4793.  move.l im_Seconds(a2),xxp_asec(a1) ;keep message arrival time for next
  4794.  move.l im_Micros(a2),xxp_amic(a1)
  4795.  sub.w xxp_LeftEdge(a5),d1 ;d1 = pointer xpos rel to left border
  4796.  bmi .scry
  4797.  sub.w xxp_TopEdge(a5),d2  ;d2 = pointer ypos rel to top border
  4798.  bmi .scry
  4799.  cmp.w xxp_PWidth(a5),d1   ;if in right border, see if ^V
  4800.  bcc.s .vert
  4801.  cmp.w xxp_PHeight(a5),d2  ;if in bot border, see if <>
  4802.  bcs .scry
  4803.  move.w xxp_PWidth(a5),d4
  4804.  move.l xxp_rtob(a1),a2
  4805.  sub.w ig_Width(a2),d4
  4806.  cmp.w d4,d1
  4807.  bcc.s .rtob
  4808.  sub.w ig_Width(a2),d4
  4809.  cmp.w d4,d1
  4810.  bcc.s .lfob
  4811.  bra .scry
  4812. .vert:
  4813.  move.w xxp_PHeight(a5),d4
  4814.  cmp.w d4,d2
  4815.  bcc .scry
  4816.  move.l xxp_upob(a1),a2
  4817.  sub.w ig_Height(a2),d4
  4818.  cmp.w d4,d2
  4819.  bcc.s .dnob
  4820.  sub.w ig_Height(a2),d4
  4821.  cmp.w d4,d2
  4822.  bcc.s .upob
  4823.  bra.s .scry
  4824.  
  4825. .lfob:                     ;left object clicked
  4826.  tst.w d3
  4827.  beq .null                 ;(ignore mouse up)
  4828.  tst.l xxp_hztp(a0)
  4829.  beq .null                 ;(null if can't move left)
  4830.  moveq #1,d3               ;d3 = 1 = <
  4831.  subq.l #1,xxp_hztp(a0)
  4832.  bra.s .obfx
  4833.  
  4834. .rtob:                     ;right object clicked
  4835.  tst.w d3
  4836.  beq .null
  4837.  move.l xxp_hztt(a0),d4
  4838.  sub.l xxp_hzvs(a0),d4
  4839.  cmp.l xxp_hztp(a0),d4
  4840.  ble .null
  4841.  moveq #2,d3               ;d3 = 2 = >
  4842.  addq.l #1,xxp_hztp(a0)
  4843.  bra.s .obfx
  4844.  
  4845. .upob:                     ;up object clicked
  4846.  tst.w d3
  4847.  beq .null
  4848.  tst.l xxp_vttp(a0)
  4849.  beq .null
  4850.  subq.l #1,xxp_vttp(a0)
  4851.  moveq #3,d3               ;d3 = 3 = ^
  4852.  bra.s .obfx
  4853.  
  4854. .dnob:                     ;down object clicked
  4855.  tst.w d3
  4856.  beq .null
  4857.  move.l xxp_vttt(a0),d4
  4858.  sub.l xxp_vtvs(a0),d4
  4859.  cmp.l xxp_vttp(a0),d4
  4860.  ble .null
  4861.  moveq #4,d3               ;d3 = 4 = V
  4862.  addq.l #1,xxp_vttp(a0)
  4863.  
  4864. .obfx:                     ;<>^V clicked - re-render slider
  4865.  moveq #0,d0
  4866.  moveq #0,d1
  4867.  bsr TLWscroll             ;fix slider
  4868.  bra.s .scyc
  4869. .scry:                     ;return scroller data
  4870.  moveq #-1,d0
  4871.  moveq #0,d1
  4872.  bsr TLWscroll             ;get tops
  4873.  moveq #0,d3               ;d3 = 0 if slider
  4874. .scyc:
  4875.  move.l #$98,d0            ;d0 = $98
  4876.  move.l xxp_hztp(a0),d1    ;d1 = horiz top
  4877.  move.l xxp_vttp(a0),d2    ;d2 = vert top
  4878.  bra .done
  4879.  
  4880.  
  4881. *>>>> open a window &/or initialise everything
  4882.  
  4883. ;d0 = window num (if -1, don't open one)
  4884. ;d1,d2 d3,d4 d5,d6 = posn, minsize, maxsize } unused if d0 = -1, which
  4885. ;d7 = flags (0,1 for defaults)(-1 = sliders)} simply initialises everything
  4886. ;a0 = title (undef if borderless)           }
  4887.  
  4888. TLWindow:
  4889.  movem.l d0-d7/a0-a6,-(a7) ;save all registers except result in D0
  4890.  clr.l xxp_errn(a4)
  4891.  
  4892. ; if TLscreen has not been called, attach default public screen
  4893.  
  4894.  tst.l xxp_Screen(a4)
  4895.  bne.s .scgot
  4896.  move.l xxp_intb(a4),a6
  4897.  sub.l a0,a0
  4898.  jsr _LVOLockPubScreen(a6)
  4899.  move.l d0,xxp_Screen(a4)
  4900.  beq .bad1                 ;bad if can't lock (unlikely)
  4901.  move.w #-1,xxp_Public(a4) ;set to unlock on close-down
  4902. .scgot:
  4903.  
  4904.  tst.w xxp_Public(a4)      ;go if everything initialised
  4905.  bgt .redi
  4906.  
  4907. ; initialise everything (note: TLColdstart zeroised everything already)
  4908.  
  4909.  move.l xxp_Screen(a4),a5  ;set screen data   (xxp_Width,Depth,Height)
  4910.  moveq #0,d0
  4911.  move.w sc_Width(a5),d0
  4912.  move.l d0,xxp_Width(a4)
  4913.  move.w sc_Height(a5),d0
  4914.  move.l d0,xxp_Height(a4)
  4915.  moveq #0,d0
  4916.  move.l sc_RastPort+rp_BitMap(a5),a0
  4917.  move.b bm_Depth(a0),d0
  4918.  move.l d0,xxp_Depth(a4)
  4919.  
  4920.  move.l xxp_intb(a4),a6    ;load system prefs for printer data
  4921.  move.l #pf_SIZEOF,d0
  4922.  sub.l d0,a7
  4923.  move.l a7,a0
  4924.  jsr _LVOGetPrefs(a6)
  4925.  move.b pf_PaperLength+1(a7),xxp_lppg(a4) ;get prefs lines/page
  4926.  subq.b #8,xxp_lppg(a4)    ;allow 8 lines runoff
  4927.  moveq #80,d0
  4928.  move.b pf_PrintLeftMargin+1(a7),d1 ;get prefs left margin
  4929.  move.b d1,xxp_marg(a4)
  4930.  add.b pf_PrintRightMargin+1(a7),d1
  4931.  sub.b d1,d0
  4932.  move.b d0,xxp_cpln(a4)    ;get prefs chrs per line
  4933.  add.l #pf_SIZEOF,a7
  4934.  move.b #-1,xxp_pica(a4)   ;default pica
  4935.  
  4936.  move.w #-1,xxp_Active(a4) ;no window yet active
  4937.  addq.w #2,xxp_Public(a4)  ;set xxp_Public (scrn on exit: 1=unlock 2=close)
  4938.  
  4939.  move.l xxp_intb(a4),a0    ;make busy sprite for TLBusy/Unbusy
  4940.  cmp.w #39,LIB_VERSION(a0)
  4941.  bcc.s .bsuq               ;go if OS3.0+
  4942.  moveq #.bsue-.bsu,d1
  4943.  move.l d1,d0
  4944.  bsr TLChip
  4945.  move.l d0,xxp_busy(a4)    ;create chip ram for busymem
  4946.  beq .bad4                 ;EQ, busymem=0 if failed (unlikely)
  4947.  move.l d0,a1              ;tfr .bsu data to busymem
  4948.  lea .bsu,a0
  4949.  subq.l #1,d1
  4950. .tfr:
  4951.  move.b (a0)+,(a1)+
  4952.  dbra d1,.tfr
  4953. .bsuq:
  4954.  
  4955.  move.l #256,d0            ;* put .pix data in chip ram
  4956.  bsr TLChip
  4957.  beq .bad4                 ;bad if out of chip ram
  4958.  move.l d0,d4              ;d4 = chip mem address
  4959.  move.l #rp_SIZEOF+bm_SIZEOF,d0
  4960.  bsr TLPublic
  4961.  move.l d0,d3              ;d3 = rastport+bitmap address
  4962.  beq .bad2                 ;bad if out of public mem
  4963.  move.l d0,xxp_pixx(a4)
  4964.  move.l xxp_gfxb(a4),a6
  4965.  move.l d0,a1
  4966.  jsr _LVOInitRastPort(a6)  ;init the rastport
  4967.  move.l d3,a0
  4968.  add.w #rp_SIZEOF,a0       ;init the bitmap
  4969.  moveq #2,d0
  4970.  move.l #128,d1
  4971.  moveq #8,d2
  4972.  jsr _LVOInitBitMap(a6)
  4973.  move.l d3,a0              ;a0 = bitmap
  4974.  add.w #rp_SIZEOF,a0
  4975.  move.l d3,a1              ;a1 = rasport
  4976.  move.l a0,rp_BitMap(a1)   ;point rasport to bitmap
  4977.  move.l d4,a1              ;d4,a1 = chip mem
  4978.  move.l d4,bm_Planes(a0)   ;init bitmap 1st plane
  4979.  add.l #128,d4
  4980.  move.l d4,bm_Planes+4(a0) ;init bitmap 2nd plane
  4981.  moveq #63,d0
  4982.  lea .pix,a0               ;tfr pix data to chip ram
  4983. .pixt:
  4984.  move.l (a0)+,(a1)+
  4985.  dbra d0,.pixt
  4986.  
  4987.  moveq #0,d0               ;set up xxp_pref
  4988.  bsr TLPrefs
  4989.  beq .bad2
  4990.  
  4991.  move.w #-1,xxp_ReqNull(a4)
  4992.  move.l #-1,xxp_lcom(a4)
  4993.  
  4994.  move.l #1024,d0           ;mem for xxp_gide
  4995.  bsr TLPublic
  4996.  move.l d0,xxp_gide(a4)
  4997.  beq .bad2                 ;bad if can't
  4998.  move.l #xxp_siz4+xxp_siz5+im_SIZEOF,d0 ;mem for xxp_FWork,FSuite,mesg
  4999.  bsr TLPublic
  5000.  move.l d0,xxp_FSuite(a4)
  5001.  beq .bad2                 ;bad if can't
  5002.  move.l d0,a0              ;a0=start of FSuite
  5003.  move.l d0,a1              ;a1 clears FSuite
  5004.  add.l #xxp_siz4,d0
  5005.  move.l d0,xxp_FWork(a4)   ;set FWork
  5006.  add.l #xxp_siz5,d0
  5007.  move.l d0,xxp_mesg(a4)    ;set mesg
  5008.  move.w #(xxp_siz4/4)-1,d0
  5009. .fclr:
  5010.  clr.l (a1)+               ;clear FSuite
  5011.  dbra d0,.fclr
  5012.  move.l a0,a1              ;font 0 is topaz/8
  5013.  addq.l #8,a1
  5014.  move.l a1,(a0)
  5015.  move.w #8,ta_YSize(a0)
  5016.  move.l #'topa',(a1)+
  5017.  move.l #'z.fo',(a1)+
  5018.  move.w #'nt',(a1)
  5019.  bsr TLOfont               ;open Topaz/8
  5020.  beq .badc                 ;bad if can't (can't happen?)
  5021.  
  5022.  move.l xxp_FSuite(a4),a0  ;prefs req font to font 10
  5023.  moveq #10,d0
  5024.  mulu #xxp_fsiz,d0
  5025.  add.l d0,a0
  5026.  move.l a0,a1
  5027.  addq.l #8,a1
  5028.  move.l a1,(a0)
  5029.  move.l xxp_pref(a4),a2
  5030.  move.w xxp_yhgt(a2),ta_YSize(a0)
  5031. .fnt9:
  5032.  move.b (a2)+,(a1)+
  5033.  bne .fnt9
  5034.  bsr TLOfont
  5035.  
  5036.  move.l xxp_FSuite(a4),a0  ;prefs TLReqshow font to font 11
  5037.  moveq #11,d0
  5038.  mulu #xxp_fsiz,d0
  5039.  add.l d0,a0
  5040.  move.l a0,a1
  5041.  addq.l #8,a1
  5042.  move.l a1,(a0)
  5043.  move.l xxp_pref(a4),a2
  5044.  add.w #xxp_yfsh,a2
  5045.  move.w #8,ta_YSize(a0)
  5046. .fnt8:
  5047.  move.b (a2)+,(a1)+
  5048.  bne .fnt8
  5049.  bsr TLOfont
  5050.  
  5051.  subq.l #4,a7              ;set xxp_vi
  5052.  move.l #TAG_DONE,(a7)
  5053.  move.l xxp_gadb(a4),a6
  5054.  move.l xxp_Screen(a4),a0
  5055.  move.l a7,a1
  5056.  jsr _LVOGetVisualInfoA(a6)
  5057.  move.l d0,xxp_vi(a4)
  5058.  addq.l #4,a7
  5059.  beq .bad3                 ;bad if can't get xxp_vi (unlikely)
  5060.  
  5061.  move.l #xxp_ewiv,xxp_ewid(a4)  ;set up xxp_ERport, xxp_EBmap
  5062.  move.l #xxp_ehgv,xxp_ehgt(a4)
  5063.  move.l #bm_SIZEOF+rp_SIZEOF,d0
  5064.  bsr TLPublic
  5065.  move.l d0,xxp_EBmap(a4)
  5066.  beq .bad2                 ;go if out of mem
  5067.  add.l #bm_SIZEOF,d0
  5068.  move.l d0,xxp_ERport(a4)
  5069.  move.l xxp_gfxb(a4),a6    ;initialise bitmaps
  5070.  move.l xxp_Depth(a4),d0
  5071.  move.l xxp_ewid(a4),d1    ;max edit width
  5072.  move.l xxp_ehgt(a4),d2    ;max font height
  5073.  move.l xxp_EBmap(a4),a0
  5074.  jsr _LVOInitBitMap(a6)
  5075.  move.l xxp_ERport(a4),a1  ;initialise ERport
  5076.  move.l a1,a2
  5077.  jsr _LVOInitRastPort(a6)
  5078.  move.l xxp_EBmap(a4),rp_BitMap(a2) ;EBmap to ERport
  5079.  move.l xxp_ewid(a4),d6    ;set d6=bytes in EBmap plane
  5080.  mulu xxp_ehgt+2(a4),d6
  5081.  lsr.l #3,d6
  5082.  move.l xxp_Depth(a4),d4   ;d4 counts bitplanes
  5083.  subq.w #1,d4
  5084.  move.l xxp_EBmap(a4),a3   ;a3 points to bitmap mem planes
  5085.  add.l #bm_Planes,a3
  5086. .plane:
  5087.  move.l d6,d0
  5088.  bsr TLChip
  5089.  move.l d0,(a3)+           ;create next EBmap plane
  5090.  beq .bad4
  5091.  dbra d4,.plane
  5092.  
  5093.  move.l #xxp_siz3,d0       ;set up xxp_WSuite
  5094.  bsr TLPublic
  5095.  move.l d0,xxp_WSuite(a4)
  5096.  beq .bad2
  5097.  move.l d0,a0              ;clear xxp_WSuite
  5098.  move.w #(xxp_siz3/4)-1,d0
  5099. .wclr:
  5100.  clr.l (a0)+
  5101.  dbra d0,.wclr
  5102.  
  5103.  movem.l (a7)+,d0-d7/a0-a6 ;restore regs for opening window
  5104.  movem.l d0-d7/a0-a6,-(a7)
  5105.  
  5106. ; everything initialised: now open window
  5107.  
  5108. .redi:
  5109.  tst.w d0                  ;if d0=-1, do not open a window
  5110.  bmi .wrap
  5111.  
  5112.  sub.l a3,a3               ;a3 = 0 if no scrollers
  5113.  addq.l #1,d7              ;go unless d7 = -1 = scrollers wanted
  5114.  bne.s .nflz
  5115.  bsr TLSlir                ;if d7 was -1, set up a3 = scrollers
  5116.  beq .badc                 ;bad if can't
  5117.  moveq #1,d7               ;sliders set up: continue as if d7 was 0
  5118. .nflz:
  5119.  
  5120.  subq.l #1,d7              ;if d7 was -1/0/1 use standard flags
  5121.  bne.s .nfl0
  5122.  move.l #.flg1,d7          ;if d7=0, use .flg1
  5123. .nfl0:
  5124.  cmp.l #1,d7               ;if d7=1, use .flg2
  5125.  bne.s .nfl1
  5126.  move.l #.flg2,d7
  5127. .nfl1:
  5128.  
  5129.  move.l xxp_intb(a4),a6    ;if window unsizeable, no size & zoom gadgets
  5130.  cmp.w d3,d5
  5131.  bne.s .tags
  5132.  cmp.w d4,d6
  5133.  bne.s .tags
  5134.  and.l #-1-WFLG_SIZEGADGET-WFLG_HASZOOM,d7
  5135. .tags:
  5136.  
  5137.  sub.l #12*8+4,a7          ;room for 12 tags
  5138.  move.l a7,a1
  5139.  move.l #WA_Left,(a1)+     ; 1st tag: left posn
  5140.  move.l d1,(a1)+
  5141.  move.l #WA_Top,(a1)+      ; 2nd tag: top posn
  5142.  move.l d2,(a1)+
  5143.  move.l #WA_Width,(a1)+    ; 3rd tag: width (=max)
  5144.  move.l d5,(a1)+
  5145.  tst.w d5                  ;ok if width > 0
  5146.  bpl.s .nmxx
  5147.  addq.w #1,d5              ;ok if width = -1
  5148.  beq.s .nmxx
  5149.  subq.w #1,d5
  5150.  neg.w d5
  5151.  ext.l d5
  5152.  move.l #WA_InnerWidth,-8(a1) ;else, treat -1 * d5 as inner width
  5153.  move.l d5,-4(a1)
  5154. .nmxx:
  5155.  move.l #WA_Height,(a1)+   ; 4th tag: height (=max)
  5156.  move.l d6,(a1)+
  5157.  tst.w d6
  5158.  bpl.s .nmxy               ;ok if ht > 0
  5159.  addq.w #1,d6
  5160.  beq.s .nmxy               ;ok if ht = -1
  5161.  subq.w #1,d6
  5162.  neg.w d6
  5163.  ext.l d6
  5164.  move.l #WA_InnerHeight,-8(a1) ;else, treat -1 * d6 as inner height
  5165.  move.l d6,-4(a1)
  5166. .nmxy:
  5167.  move.l #WA_Flags,(a1)+    ; 5th tag: flags
  5168.  move.l d7,(a1)+
  5169.  move.l #WA_IDCMP,(a1)+    ; 6th tag: IDCMP
  5170.  move.l #.idcm,(a1)+
  5171.  and.l #WFLG_BORDERLESS,d7
  5172.  bne.s .ntit
  5173.  move.l #WA_Title,(a1)+    ; 7th tag: window title (no title if borderless)
  5174.  move.l a0,(a1)+
  5175. .ntit:
  5176.  move.l #WA_CustomScreen,(a1)+ ; 8th tag: screen pointer
  5177.  move.l xxp_Screen(a4),(a1)+
  5178.  tst.w d3
  5179.  bmi.s .nmnx
  5180.  move.l #WA_MinWidth,(a1)+ ; 9th tag: minimum width
  5181.  move.l d3,(a1)+
  5182. .nmnx:
  5183.  tst.w d4
  5184.  bmi.s .nmny
  5185.  move.l #WA_MinHeight,(a1)+ ; 10th tag: minimum height
  5186.  move.l d4,(a1)+
  5187. .nmny:
  5188.  cmp.l #0,a3
  5189.  beq.s .ngad
  5190.  move.l #WA_Gadgets,(a1)+  ; 11th tag: gadgets (if scrollers)
  5191.  move.l xxp_gadg(a4),(a1)+
  5192.  move.l #WA_AutoAdjust,(a1)+ ; 12th tag: auto adjust (set TRUE)
  5193.  move.l #-1,(a1)+
  5194. .ngad:
  5195.  move.l #TAG_DONE,(a1)
  5196.  move.l d0,d7              ;d7=window num
  5197.  sub.l a0,a0
  5198.  move.l a7,a1
  5199.  jsr _LVOOpenWindowTagList(a6) ;open window
  5200.  add.l #12*8+4,a7          ;discard flags, restore stack
  5201.  tst.l d0
  5202.  beq .bad4                 ;go if out of chip ram
  5203.  
  5204.  move.w d7,xxp_Active(a4)  ;create WSuite entry for window
  5205.  move.l xxp_WSuite(a4),a5
  5206.  mulu #xxp_siz2,d7
  5207.  add.l d7,a5
  5208.  move.l a5,xxp_AcWind(a4)
  5209.  move.l d0,a0              ;a0=window
  5210.  move.l a0,xxp_Window(a5)
  5211.  move.w #.frbk,xxp_FrontPen(a5) ;set defaults for printing data
  5212.  move.b #.mode,xxp_DrawMode(a5)
  5213.  clr.b xxp_Kludge(a5)
  5214.  clr.l xxp_LeftEdge(a5)    ;set left edge,topedge within border
  5215.  move.b wd_BorderLeft(a0),xxp_LeftEdge+1(a5)
  5216.  move.b wd_BorderTop(a0),xxp_TopEdge+1(a5)
  5217.  clr.w xxp_Fnum(a5)        ;initially font 0 ( = Topaz/8 set below)
  5218.  move.w #-1,xxp_Attc(a5)   ;Fsty inoperative (new Fnum attached)
  5219.  move.l a4,xxp_IText(a5)   ;text normally read from buff
  5220.  clr.w xxp_Fsty(a5)        ;default font style = plain
  5221.  clr.w xxp_Tspc(a5)        ;default text spacing = 0
  5222.  bsr TLWupdate             ;set PWidth,PHeight
  5223.  move.l wd_RPort(a0),a1
  5224.  move.l a1,xxp_WPort(a5)
  5225.  clr.l xxp_Menu(a5)        ;clear menu pointer
  5226.  clr.w xxp_Menuon(a5)      ;menu not on
  5227.  move.l #$00020102,xxp_shad(a5) ;shadow font default
  5228.  
  5229.  clr.l xxp_Mmem(a5)               ;} Defaults in case this window
  5230.  move.l #10000,xxp_Mmsz(a5)       ;} used for TLMultiline
  5231.  move.w #76,xxp_Mmxc(a5)          ;}
  5232.  
  5233.  move.l xxp_LeftEdge(a5),xxp_ReqLeft(a5) ;default requester posn
  5234.  clr.l xxp_Refr(a5)        ;clear refresh pointer
  5235.  
  5236.  clr.l xxp_RFont(a5)       ;clear req,help fonts & tspaces
  5237.  clr.l xxp_HFont(a5)
  5238.  clr.l xxp_RTspc(a5)
  5239.  clr.l xxp_RFsty(a5)
  5240.  move.l a3,xxp_scrl(a5)    ;xxp_scrl = xxp_scro structure, or 0
  5241.  
  5242.  moveq #0,d0               ;attach Topaz/8 plain to ITextFont
  5243.  moveq #0,d1
  5244.  moveq #0,d2
  5245.  bsr TLNewfont
  5246.  beq.s .bad4               ;bad if can't (unlikely)
  5247.  
  5248.  move.l xxp_FSuite(a4),a0  ;attach font 10 to requester
  5249.  add.w #10*xxp_fsiz,a0
  5250.  tst.l (a0)
  5251.  beq.s .f9no               ;go if no font 10
  5252.  move.l xxp_pref(a4),a0
  5253.  move.b xxp_yspc(a0),xxp_RTspc+1(a5) ;use prefs tspc (if font 10 exists)
  5254.  moveq #10,d0
  5255.  moveq #0,d1
  5256.  move.b xxp_ysty(a0),d1
  5257.  moveq #1,d2
  5258.  bsr TLNewfont
  5259.  bne.s .help               ;go if succeeds
  5260. .f9no:
  5261.  moveq #0,d0               ;else attach Topaz/8 plain to requester
  5262.  moveq #0,d1
  5263.  moveq #1,d2
  5264.  bsr TLNewfont
  5265. .help:
  5266.  
  5267.  moveq #0,d0               ;attach Topaz/8 plain to help
  5268.  moveq #0,d1
  5269.  moveq #2,d2
  5270.  bsr TLNewfont
  5271.  
  5272. .wrap:
  5273.  move.l #-1,(a7)           ;stack D0 = -1 if good
  5274.  bra.s .done
  5275.  
  5276. .bad1:
  5277.  moveq #7,d0               ;can't lock default screen (unlikely)
  5278.  bra.s .bad
  5279. .bad2:
  5280.  moveq #1,d0               ;out of public mem (unlikely)
  5281.  bra.s .bad
  5282. .bad3:
  5283.  moveq #9,d0               ;can't get xxp_vi (unlikely)
  5284.  bra.s .bad
  5285. .bad4:
  5286.  moveq #2,d0               ;out of chip mem
  5287. .bad:
  5288.  move.l d0,xxp_errn(a4)
  5289. .badc:
  5290.  clr.l (a7)                ;stack D0 = 0 if bad
  5291.  
  5292. .done:
  5293.  movem.l (a7)+,d0-d7/a0-a6 ;EQ, D0=0 if bad
  5294.  rts
  5295.  
  5296. ; constants for window
  5297. .pens: dc.l -1     ;default pens structure
  5298. .frbk: EQU $0100   ;font & back pens
  5299. .mode: EQU RP_JAM2 ;draw mode
  5300.  
  5301. ; idcmp for window
  5302. .idc0: EQU IDCMP_CLOSEWINDOW!IDCMP_VANILLAKEY!IDCMP_RAWKEY!IDCMP_IDCMPUPDATE
  5303. .idc1: EQU .idc0!IDCMP_ACTIVEWINDOW!IDCMP_INACTIVEWINDOW!IDCMP_REFRESHWINDOW
  5304. .idcm: EQU .idc1!IDCMP_MOUSEBUTTONS!IDCMP_MENUPICK!IDCMP_NEWSIZE
  5305.  
  5306. ; default flags if D7=0 (normal windows)
  5307. .flg0: EQU WFLG_SIZEGADGET!WFLG_DRAGBAR!WFLG_CLOSEGADGET!WFLG_DEPTHGADGET
  5308. .flg1: EQU .flg0!WFLG_SMART_REFRESH!WFLG_ACTIVATE!WFLG_HASZOOM
  5309.  
  5310. ; default flags if D7=1 (windows 10,11)
  5311. .flg2: EQU WFLG_BORDERLESS!WFLG_ACTIVATE!WFLG_SMART_REFRESH
  5312.  
  5313. ; busy sprite data: 4nulls, 4bytes/line (X16 lines), 4 nulls
  5314. .bsu:
  5315.  dc.w $0000,$0000,$0400,$07c0,$0000,$07c0,$0100,$0380
  5316.  dc.w $0000,$07e0,$07c0,$1ff8,$1ff0,$3fec,$3ff8,$7fde
  5317.  dc.w $3ff8,$7fbe,$7ffc,$ff7f,$7efc,$ffff,$7ffc,$ffff
  5318.  dc.w $3ff8,$7ffe,$3ff8,$7ffe,$1ff0,$3ffc,$07c0,$1ff8
  5319.  dc.w $0000,$07e0,$0000,$0000
  5320. .bsue:
  5321.  
  5322. ;pictures for tabs, &c
  5323. ;tabs: topl,over,under,topr,botl,botr,<,>,^,v,tick,dot
  5324. .pix:
  5325.  dc.b $00,$00,$00,$00,$3F,$FF,$EF,$F3,$EF,$C7,$FF,$FF,$FF,$00,$00,$00
  5326.  dc.b $00,$C0,$C0,$C0,$3F,$FF,$DF,$FB,$DF,$DF,$FF,$F3,$FF,$00,$00,$00
  5327.  dc.b $07,$F9,$C7,$F8,$3F,$FF,$1F,$F8,$BF,$DF,$FF,$F3,$FF,$00,$00,$00
  5328.  dc.b $0F,$FD,$8F,$FC,$8F,$FE,$7F,$FE,$7F,$DF,$FF,$FF,$FF,$00,$00,$00
  5329.  dc.b $1F,$FF,$9F,$FE,$4F,$FE,$7F,$FE,$DF,$7F,$FF,$FF,$FF,$00,$00,$00
  5330.  dc.b $3F,$FF,$3F,$FF,$27,$FC,$FF,$FF,$DF,$BF,$FF,$CF,$FF,$00,$00,$00
  5331.  dc.b $3F,$FF,$3F,$FF,$0C,$F0,$FF,$FF,$DF,$DF,$FF,$CF,$FF,$00,$00,$00
  5332.  dc.b $3F,$FF,$3F,$FF,$01,$80,$FF,$FF,$FF,$EF,$FF,$FF,$FF,$00,$00,$00
  5333.  
  5334.  dc.b $01,$80,$01,$80,$FF,$FC,$FF,$FF,$F7,$FF,$FC,$E1,$FF,$00,$00,$00
  5335.  dc.b $0F,$31,$0F,$30,$FF,$FC,$E7,$E7,$E3,$E3,$FC,$CC,$C3,$00,$00,$00
  5336.  dc.b $3F,$C7,$BF,$C4,$FF,$FC,$E3,$C7,$C1,$E3,$F9,$CC,$99,$00,$00,$00
  5337.  dc.b $7F,$F3,$7F,$F2,$EF,$F8,$81,$81,$80,$E3,$F9,$E1,$01,$00,$00,$00
  5338.  dc.b $7F,$F9,$FF,$F8,$3F,$F0,$80,$01,$E3,$80,$F3,$87,$89,$00,$00,$00
  5339.  dc.b $FF,$FC,$FF,$FC,$1F,$E0,$81,$81,$E3,$C1,$33,$33,$D9,$00,$00,$00
  5340.  dc.b $FF,$FC,$FF,$FC,$03,$00,$E3,$C7,$E3,$E3,$87,$33,$03,$00,$00,$00
  5341.  dc.b $FF,$FC,$FF,$FC,$00,$00,$E7,$E7,$E3,$F7,$E7,$87,$FF,$00,$00,$00
  5342.  
  5343. *>>>> shut down everything started by TLWindow
  5344. TLWclose:
  5345.  movem.l d0-d1/a0-a1/a5-a6,-(a7) ;saves all regs
  5346.  bsr TLClosefile           ;close xxp_hndl if open
  5347.  
  5348.  move.l xxp_splc(a4),d0    ;remove spell.library resources
  5349.  beq.s .splc2              ;go if splc unset
  5350.  move.l d0,a5              ;a5 = xxp_Spel
  5351.  move.l xxp_sysb(a4),a6
  5352.  move.l xxp_dptr(a5),d0    ;go if xxp_dptr unset
  5353.  beq.s .splc1
  5354.  move.l d0,a1              ;free xxp_dptr
  5355.  jsr _LVOFreeVec(a6)
  5356.  clr.l xxp_dptr(a5)
  5357. .splc1:
  5358.  move.l xxp_pptr(a5),d0    ;go if xxp_pptr unset
  5359.  beq.s .splc2
  5360.  move.l d0,a1
  5361.  jsr _LVOFreeVec(a6)       ;free xxp_pptr
  5362.  clr.l xxp_pptr(a5)
  5363. .splc2:
  5364.  
  5365.  tst.l xxp_Screen(a4)      ;go if no screen ever attached
  5366.  beq.s .quit
  5367.  tst.w xxp_Public(a4)      ;go if initialised
  5368.  bgt.s .init
  5369.  addq.w #2,xxp_Public(a4)  ;go close/unlock screen
  5370.  bra.s .unlk
  5371. .init:
  5372.  
  5373.  tst.l xxp_WSuite(a4)      ;close window 0-9 (if open) if WSuite exists
  5374.  beq.s .nsui
  5375.  moveq #9,d0
  5376. .nxsui:
  5377.  bsr TLWsub
  5378.  dbra d0,.nxsui
  5379. .nsui:
  5380.  
  5381.  tst.l xxp_FSuite(a4)      ;close font 0-9 (if open) if FSuite exists
  5382.  beq.s .nfsu
  5383.  moveq #9,d0
  5384. .nxfsu:
  5385.  bsr TLFsub
  5386.  dbra d0,.nxfsu
  5387. .nfsu:
  5388.  
  5389.  bsr TLSlik                ;free xxp_slid if any
  5390.  
  5391.  move.l xxp_vi(a4),d0      ;free xxp_vi (if any)
  5392.  beq.s .unlk
  5393.  move.l d0,a0
  5394.  move.l xxp_gadb(a4),a6
  5395.  jsr _LVOFreeVisualInfo(a6)
  5396. .unlk:
  5397.  
  5398.  move.l xxp_intb(a4),a6    ;close/unlock screen
  5399.  cmp.w #2,xxp_Public(a4)   ;go if screen to be closed
  5400.  beq.s .clos
  5401.  sub.l a0,a0               ;unlock screen, leave unclosed
  5402.  move.l xxp_Screen(a4),a1
  5403.  jsr _LVOUnlockPubScreen(a6)
  5404.  bra.s .quit
  5405. .clos:
  5406.  move.l xxp_Screen(a4),a0  ;close screen
  5407.  jsr _LVOCloseScreen(a6)
  5408. .quit:
  5409.  
  5410.  clr.l xxp_Screen(a4)      ;note that nothing now initialised
  5411.  
  5412.  move.l a4,a0              ;free remember if xxp_memk was used
  5413.  add.l #xxp_memk,a0
  5414.  tst.l (a0)
  5415.  beq.s .cmem
  5416.  move.l xxp_intb(a4),a6
  5417.  moveq #-1,d0
  5418.  move.l a0,-(a7)
  5419.  jsr _LVOFreeRemember(a6)
  5420.  move.l (a7)+,a0
  5421.  clr.l (a0)                ;note xxp_memk now cleared
  5422.  
  5423. .cmem:
  5424.  movem.l (a7)+,d0-d1/a0-a1/a5-a6
  5425.  rts
  5426.  
  5427.  
  5428. *>>>> set up xxp_slis structure, pointed to by xxp_slid
  5429. TLSlis:
  5430.  movem.l d0-d7/a0-a6,-(a7) ;save all
  5431.  clr.l xxp_errn(a4)
  5432.  moveq #xxp_slsz,d0        ;create mem for xxp_slis structure
  5433.  bsr TLPublic
  5434.  beq .bad1                 ;bad if can't
  5435.  move.l d0,xxp_slid(a4)    ;point xxp_slid to xxp_slis structure
  5436.  move.l d0,a3              ;a3 = xxp_slis
  5437.  move.l a3,a0
  5438.  moveq #xxp_slsz,d0
  5439.  subq.w #1,d0
  5440. .clr:
  5441.  clr.b (a0)+               ;clear the structure
  5442.  dbra d0,.clr
  5443.  move.l a3,a0              ;get prefs data to xxp_psec,mic
  5444.  add.w #xxp_psec-pf_KeyRptSpeed,a0
  5445.  moveq #pf_KeyRptDelay,d0
  5446.  move.l xxp_intb(a4),a6
  5447.  jsr _LVOGetPrefs(a6)
  5448.  move.l xxp_Screen(a4),a0  ;DrawInfo to xxp_draw
  5449.  jsr _LVOGetScreenDrawInfo(a6)
  5450.  move.l d0,xxp_draw(a3)
  5451.  beq .bad3
  5452.  moveq #SIZEIMAGE,d0       ;size object
  5453.  bsr.s .Objt
  5454.  move.l d0,xxp_szob(a3)
  5455.  beq.s .bad2
  5456.  moveq #LEFTIMAGE,d0       ;left object
  5457.  bsr.s .Objt
  5458.  move.l d0,xxp_lfob(a3)
  5459.  beq.s .bad2
  5460.  moveq #RIGHTIMAGE,d0      ;right object
  5461.  bsr.s .Objt
  5462.  move.l d0,xxp_rtob(a3)
  5463.  beq.s .bad2
  5464.  moveq #UPIMAGE,d0         ;up object
  5465.  bsr.s .Objt
  5466.  move.l d0,xxp_upob(a3)
  5467.  beq.s .bad2
  5468.  moveq #DOWNIMAGE,d0       ;down object
  5469.  bsr.s .Objt
  5470.  move.l d0,xxp_dnob(a3)
  5471.  beq.s .bad2
  5472.  moveq #CHECKIMAGE,d0      ;check object
  5473.  bsr.s .Objt
  5474.  move.l d0,xxp_ckob(a3)
  5475.  beq.s .bad2
  5476.  moveq #-1,d0              ;quit ok
  5477.  bra.s .quit
  5478. .bad1:                     ;bad 1: out of public ram
  5479.  addq.w #1,xxp_errn+2(a4)
  5480.  bra.s .bad
  5481. .bad2
  5482.  move.w #36,xxp_errn+2(a4) ;bad 2: can't create rendering objects
  5483.  bra.s .bad
  5484. .bad3:                     ;bad 3: can't get screen DrawInfo
  5485.  move.w #37,xxp_errn+2(a4)
  5486. .bad:
  5487.  bsr TLSlik                ;remove everything if bad
  5488.  moveq #0,d0               ;EQ if bad
  5489. .quit:
  5490.  movem.l (a7)+,d0-d7/a0-a6
  5491.  rts
  5492.  
  5493. .Objt                      ;** create system image object,  D0 = which
  5494.  movem.l d1-d7/a0-a6,-(a7) ;save all except result in D0
  5495.  sub.l a0,a0               ;a0 = class = null
  5496.  lea .inam,a1              ;a1 = class name (since a0 null)
  5497.  sub.w #28,a7              ;room for 3 tags
  5498.  move.l a7,a2
  5499.  move.l #SYSIA_DrawInfo,(a2)+ ;tag 1: Draw Info
  5500.  move.l xxp_draw(a3),(a2)+
  5501.  move.l #SYSIA_Which,(a2)+    ;tag 2: Which = D0 on call
  5502.  move.l d0,(a2)+
  5503.  move.l #SYSIA_Size,(a2)+     ;tag 3: size = SYSISIZE_MEDRES
  5504.  move.l #SYSISIZE_MEDRES,(a2)+
  5505.  clr.l (a2)                ;delimit tags
  5506.  move.l a7,a2              ;a2 = tags
  5507.  move.l xxp_intb(a4),a6
  5508.  jsr _LVONewObjectA(a6)    ;get object pointer
  5509.  add.w #28,a7              ;discard tags
  5510.  movem.l (a7)+,d1-d7/a0-a6
  5511.  rts
  5512.  
  5513. .inam: dc.b "sysiclass",0
  5514.  ds.w 0
  5515.  
  5516. *>>>> remove xxp_slis structure from xxp_slid
  5517. TLSlik:
  5518.  movem.l d0-d7/a0-a6,-(a7) ;save all
  5519.  move.l xxp_slid(a4),d0
  5520.  beq.s .done               ;go if already doesn't exist
  5521.  move.l d0,a3
  5522.  move.l xxp_intb(a4),a6
  5523.  move.l xxp_szob(a3),d0
  5524.  move.l d0,a0
  5525.  beq.s .draw
  5526.  jsr _LVODisposeObject(a6)
  5527.  move.l xxp_lfob(a3),d0
  5528.  move.l d0,a0
  5529.  beq.s .draw
  5530.  jsr _LVODisposeObject(a6)
  5531.  move.l xxp_rtob(a3),d0
  5532.  move.l d0,a0
  5533.  beq.s .draw
  5534.  jsr _LVODisposeObject(a6)
  5535.  move.l xxp_upob(a3),d0
  5536.  move.l d0,a0
  5537.  beq.s .draw
  5538.  jsr _LVODisposeObject(a6)
  5539.  move.l xxp_dnob(a3),d0
  5540.  move.l d0,a0
  5541.  beq.s .draw
  5542.  jsr _LVODisposeObject(a6)
  5543.  move.l xxp_ckob(a3),d0
  5544.  move.l d0,a0
  5545.  beq.s .draw
  5546.  jsr _LVODisposeObject(a6)
  5547. .draw:
  5548.  move.l xxp_Screen(a4),a0  ;dispose of sceen's DrawInfo
  5549.  move.l xxp_draw(a3),d0
  5550.  move.l d0,a1
  5551.  beq.s .done
  5552.  jsr _LVOFreeScreenDrawInfo(a6)
  5553. .done:
  5554.  clr.l xxp_slid(a4)        ;note xxp_slis doesn't exist
  5555.  movem.l (a7)+,d0-d7/a0-a6 ;(FreeMem will release its memory)
  5556.  rts
  5557.  
  5558. *>>>> set up window sliders
  5559. TLSlir:
  5560.  movem.l d0-d7/a0-a2/a4-a6,-(a7) ;save all exc result in a3
  5561.  clr.l xxp_errn(a4)
  5562.  tst.l xxp_slid(a4)        ;slid already exists?
  5563.  bne.s .cont               ;yes, go
  5564.  bsr TLSlis                ;no, set up slid
  5565.  beq .done                 ;go if can't
  5566. .cont:
  5567.  moveq #xxp_scrs,d0
  5568.  bsr TLPublic
  5569.  beq .bad1
  5570.  move.l d0,a3              ;a3 = xxp_slir structure
  5571.  move.l xxp_slid(a4),a2    ;a2 = xxp_slis structure
  5572.  
  5573.  move.l xxp_szob(a2),a0    ;set d7 = max ht of left, right, size objects
  5574.  moveq #0,d7
  5575.  move.w ig_Height(a0),d7
  5576.  move.l xxp_lfob(a2),a0
  5577.  cmp.w ig_Height(a0),d7
  5578.  bcc.s .mxh1
  5579.  move.w ig_Height(a0),d7
  5580. .mxh1:
  5581.  move.l xxp_rtob(a2),a0
  5582.  cmp.w ig_Height(a0),d7
  5583.  bcc.s .mxh2
  5584.  move.w ig_Height(a0),d7
  5585. .mxh2:
  5586.  
  5587.  moveq #0,d6               ;set d6 = max wd of up, down, size objects
  5588.  move.l xxp_szob(a2),a0
  5589.  move.w ig_Width(a0),d6
  5590.  move.l xxp_upob(a2),a0
  5591.  cmp.w ig_Width(a0),d6
  5592.  bcc.s .mxw1
  5593.  move.w ig_Width(a0),d6
  5594. .mxw1:
  5595.  move.l xxp_dnob(a2),a0
  5596.  cmp.w ig_Width(a0),d6
  5597.  bcc.s .mxw2
  5598.  move.w ig_Width(a0),d6
  5599. .mxw2:
  5600.  
  5601.  move.l xxp_Screen(a4),a0  ;set d4 = screen top + font height + 1
  5602.  moveq #0,d4
  5603.  move.b sc_WBorTop(a0),d4
  5604.  move.l sc_Font(a0),a0
  5605.  add.w ta_YSize(a0),d4
  5606.  addq.w #1,d4
  5607.  
  5608.  sub.w #200,a7             ;room for tags
  5609.  move.l a7,a6
  5610.  move.l #PGA_Freedom,(a6)+ ;tag 1: freedom = horizontal
  5611.  move.l #FREEHORIZ,(a6)+
  5612.  move.l #GA_LEFT,(a6)+     ;tag 2: left = 3
  5613.  move.l #3,(a6)+
  5614.  move.l #GA_RelBottom,(a6)+ ;tag 3: relbottom = 3 - D7
  5615.  moveq #3,d0
  5616.  sub.l d7,d0
  5617.  move.l d0,(a6)+
  5618.  move.l #GA_RelWidth,(a6)+ ;tag 4: relwidth = -(lfob wd + rtob wd + d6 +5)
  5619.  moveq #-5,d0
  5620.  sub.l d6,d0
  5621.  moveq #0,d1
  5622.  move.l xxp_lfob(a2),a0
  5623.  move.w ig_Width(a0),d1
  5624.  move.l xxp_rtob(a2),a0
  5625.  add.w ig_Width(a0),d1
  5626.  sub.l d1,d0
  5627.  move.l d0,(a6)+
  5628.  move.l #GA_Height,(a6)+   ;tag 5: height = d7 - 4
  5629.  move.l d7,d0
  5630.  subq.l #4,d0
  5631.  move.l d0,(a6)+
  5632.  move.l #GA_BottomBorder,(a6)+  ;tag 6: bottom border = 1
  5633.  move.l #1,(a6)+
  5634.  move.l #GA_ID,(a6)+       ;tag 7: id = 50
  5635.  move.l #50,(a6)+
  5636.  move.l #PGA_Total,(a6)+   ;tag 8: total = 256 pro-tem
  5637.  move.l #256,(a6)+
  5638.  move.l #256,xxp_hztt(a3)
  5639.  move.l #PGA_Visible,(a6)+ ;tag 9: visible = 256 pro-tem
  5640.  move.l #256,(a6)+
  5641.  move.l #256,xxp_hzvs(a3)
  5642.  move.l #PGA_Top,(a6)+     ;tag 10: top = 0 pro-tem
  5643.  clr.l (a6)+
  5644.  clr.l xxp_hztp(a3)
  5645.  move.l #PGA_Borderless,(a6)+   ;tag 11: borderless = 1
  5646.  move.l #1,(a6)+
  5647.  move.l #ICA_TARGET,(a6)+  ;tag 12: target = ictarget
  5648.  move.l #ICTARGET_IDCMP,(a6)+
  5649.  move.l #PGA_NewLook,(a6)+ ;tag 13 newlook = true
  5650.  move.l #1,(a6)+
  5651.  clr.l (a6)
  5652.  
  5653.  sub.l a0,a0               ;create horz scroller object
  5654.  lea .gcls,a1
  5655.  move.l a7,a2
  5656.  move.l xxp_intb(a4),a6
  5657.  jsr _LVONewObjectA(a6)
  5658.  add.w #200,a7
  5659.  move.l d0,xxp_scoh(a3)
  5660.  beq .bad2a
  5661.  
  5662.  sub.w #200,a7             ;tags for < button
  5663.  move.l a7,a6
  5664.  move.l xxp_slid(a4),a2
  5665.  
  5666.  move.l #GA_Image,(a6)+    ;tag 1: image = lfob
  5667.  move.l xxp_lfob(a2),(a6)+
  5668.  move.l #GA_RelRight,(a6)+ ;tag 2: rel right = -(lfob wd + rtob wd + d6 - 1)
  5669.  moveq #1,d0
  5670.  moveq #0,d1
  5671.  move.l xxp_lfob(a2),a0
  5672.  move.w ig_Width(a0),d1
  5673.  move.l xxp_rtob(a2),a0
  5674.  add.w ig_Width(a0),d1
  5675.  sub.l d1,d0
  5676.  sub.l d6,d0
  5677.  move.l d0,(a6)+
  5678.  move.l #GA_RelBottom,(a6)+ ;tag 3: rel bottom = -(lfob ht -1)
  5679.  moveq #1,d0
  5680.  moveq #0,d1
  5681.  move.l xxp_lfob(a2),a0
  5682.  move.w ig_Height(a0),d1
  5683.  sub.l d1,d0
  5684.  move.l d0,(a6)+
  5685.  move.l #GA_BottomBorder,(a6)+ ;tag 4: bottom border = 1
  5686.  move.l #1,(a6)+
  5687.  move.l #GA_Previous,(a6)+  ;tag 5: previous = slider ob
  5688.  move.l xxp_scoh(a3),(a6)+
  5689.  move.l #GA_ID,(a6)+        ;tag 6: id = 51
  5690.  move.l #51,(a6)+
  5691.  move.l #ICA_TARGET,(a6)+   ;tag 7: target = idcmp
  5692.  move.l #ICTARGET_IDCMP,(a6)+
  5693.  clr.l (a6)
  5694.  
  5695.  sub.l a0,a0               ;make < button
  5696.  lea .bcls,a1
  5697.  move.l a7,a2
  5698.  move.l xxp_intb(a4),a6
  5699.  jsr _LVONewObjectA(a6)
  5700.  add.w #200,a7
  5701.  move.l d0,xxp_slfo(a3)
  5702.  beq .bad2b
  5703.  
  5704.  sub.w #200,a7             ;tags for > button
  5705.  move.l a7,a6
  5706.  move.l xxp_slid(a4),a2
  5707.  
  5708.  move.l #GA_Image,(a6)+    ;tag 1: image = right object
  5709.  move.l xxp_rtob(a2),(a6)+
  5710.  move.l #GA_RelRight,(a6)+ ;tag 2: rel right = -(rtob wd + d6 - 1)
  5711.  moveq #1,d0
  5712.  moveq #0,d1
  5713.  move.l xxp_rtob(a2),a0
  5714.  move.w ig_Width(a0),d1
  5715.  add.l d6,d1
  5716.  sub.l d1,d0
  5717.  move.l d0,(a6)+
  5718.  move.l #GA_RelBottom,(a6)+ ;tag 3: rel bottom = -(rtob ht - 1)
  5719.  moveq #1,d0
  5720.  moveq #0,d1
  5721.  move.l xxp_rtob(a2),a0
  5722.  move.w ig_Height(a0),d1
  5723.  sub.l d1,d0
  5724.  move.l d0,(a6)+
  5725.  move.l #GA_BottomBorder,(a6)+ ;tag 4: bottom border = 1
  5726.  move.l #1,(a6)+
  5727.  move.l #GA_Previous,(a6)+ ;tag 5: previous = left gadget
  5728.  move.l xxp_slfo(a3),(a6)+
  5729.  move.l #GA_ID,(a6)+       ;tag 6: id = 52
  5730.  move.l #52,(a6)+
  5731.  move.l #ICA_TARGET,(a6)+  ;tag 7: target = idcmp
  5732.  move.l #ICTARGET_IDCMP,(a6)+
  5733.  clr.l (a6)
  5734.  
  5735.  sub.l a0,a0               ;make > button
  5736.  lea .bcls,a1
  5737.  move.l a7,a2
  5738.  move.l xxp_intb(a4),a6
  5739.  jsr _LVONewObjectA(a6)
  5740.  add.w #200,a7
  5741.  move.l d0,xxp_srto(a3)
  5742.  beq .bad2c
  5743.  
  5744.  sub.w #200,a7             ;tags for vertical slider
  5745.  move.l a7,a6
  5746.  move.l xxp_slid(a4),a2
  5747.  
  5748.  move.l #PGA_Freedom,(a6)+ ;tag 1: freedom = vertical
  5749.  move.l #FREEVERT,(a6)+
  5750.  move.l #GA_Top,(a6)+      ;tag 2: top = d4 + 1
  5751.  move.l d4,d0
  5752.  addq.l #1,d0
  5753.  move.l d0,(a6)+
  5754.  move.l #GA_RelRight,(a6)+ ;tag 3: rel right = -(d6 - 4)
  5755.  moveq #4,d0
  5756.  sub.l d6,d0
  5757.  addq.l #1,d0              ;why needed?????????????
  5758.  move.l d0,(a6)+
  5759.  move.l #GA_RelHeight,(a6)+ ;tag 4: rel height = -(sz+up+dn ht + 2 + d4)
  5760.  moveq #-2,d0
  5761.  moveq #0,d1
  5762.  move.l xxp_szob(a2),a0
  5763.  move.w ig_Height(a0),d1
  5764.  move.l xxp_upob(a2),a0
  5765.  add.w ig_Height(a0),d1
  5766.  move.l xxp_dnob(a2),a0
  5767.  add.w ig_Height(a0),d1
  5768.  sub.l d1,d0
  5769.  sub.l d4,d0
  5770.  move.l d0,(a6)+
  5771.  move.l #GA_Width,(a6)+    ;tag 5: width = d6 - 6
  5772.  move.l d6,d0
  5773.  subq.l #6,d0
  5774.  subq.l #2,d0              ;why needed ?????????
  5775.  move.l d0,(a6)+
  5776.  move.l #GA_RightBorder,(a6)+ ;tag 6: right border = 1
  5777.  move.l #1,(a6)+
  5778.  move.l #GA_ID,(a6)+       ;tag 7: id = 53
  5779.  move.l #53,(a6)+
  5780.  move.l #PGA_Total,(a6)+   ;tag 8: total = 256
  5781.  move.l #256,(a6)+
  5782.  move.l #256,xxp_vttt(a3)
  5783.  move.l #PGA_Visible,(a6)+ ;tag 9: visible = 256
  5784.  move.l #256,(a6)+
  5785.  move.l #256,xxp_vtvs(a3)
  5786.  move.l #PGA_Top,(a6)+     ;tag 10: top = 0
  5787.  clr.l (a6)+
  5788.  clr.l xxp_vttp(a3)
  5789.  move.l #PGA_Borderless,(a6)+   ;tag 11: borderless = 1
  5790.  move.l #1,(a6)+
  5791.  move.l #ICA_TARGET,(a6)+  ;tag 12: target = idcmp
  5792.  move.l #ICTARGET_IDCMP,(a6)+
  5793.  move.l #PGA_NewLook,(a6)+ ;tag 13 newlook = true
  5794.  move.l #1,(a6)+
  5795.  clr.l (a6)
  5796.  
  5797.  sub.l a0,a0               ;make vertical slider
  5798.  lea .gcls,a1
  5799.  move.l a7,a2
  5800.  move.l xxp_intb(a4),a6
  5801.  jsr _LVONewObjectA(a6)
  5802.  add.w #200,a7
  5803.  move.l d0,xxp_scov(a3)
  5804.  beq .bad2d
  5805.  
  5806.  sub.w #200,a7             ;tags for ^ button
  5807.  move.l a7,a6
  5808.  move.l xxp_slid(a4),a2
  5809.  
  5810.  move.l #GA_Image,(a6)+    ;tag 1: image = up object
  5811.  move.l xxp_upob(a2),(a6)+
  5812.  move.l #GA_RelRight,(a6)+ ;tag 2: rel right = -(upob wd - 1)
  5813.  moveq #1,d0
  5814.  moveq #0,d1
  5815.  move.l xxp_upob(a2),a0
  5816.  move.w ig_Width(a0),d1
  5817.  sub.l d1,d0
  5818.  move.l d0,(a6)+
  5819.  move.l #GA_RelBottom,(a6)+    ;tag 3: rel bottom = -(up+dn+sz ob - 1)
  5820.  moveq #1,d0
  5821.  moveq #0,d1
  5822.  move.l xxp_upob(a2),a0
  5823.  move.w ig_Height(a0),d1
  5824.  move.l xxp_dnob(a2),a0
  5825.  add.w ig_Height(a0),d1
  5826.  move.l xxp_szob(a2),a0
  5827.  add.w ig_Height(a0),d1
  5828.  sub.l d1,d0
  5829.  move.l d0,(a6)+
  5830.  move.l #GA_RightBorder,(a6)+  ;tag 4: right border = 1
  5831.  move.l #1,(a6)+
  5832.  move.l #GA_Previous,(a6)+ ;tag 5: previous = vert slider
  5833.  move.l xxp_scov(a3),(a6)+
  5834.  move.l #GA_ID,(a6)+       ;tag 6: id = 54
  5835.  move.l #54,(a6)+
  5836.  move.l #ICA_TARGET,(a6)+  ;tag 7: target = idcmp
  5837.  move.l #ICTARGET_IDCMP,(a6)+
  5838.  clr.l (a6)
  5839.  
  5840.  sub.l a0,a0               ;make ^ button
  5841.  lea .bcls,a1
  5842.  move.l a7,a2
  5843.  move.l xxp_intb(a4),a6
  5844.  jsr _LVONewObjectA(a6)
  5845.  add.w #200,a7
  5846.  move.l d0,xxp_supo(a3)
  5847.  beq .bad2e
  5848.  
  5849.  sub.w #200,a7             ;tags for V button
  5850.  move.l a7,a6
  5851.  move.l xxp_slid(a4),a2
  5852.  
  5853.  move.l #GA_Image,(a6)+    ;tag 1: image = down object
  5854.  move.l xxp_dnob(a2),(a6)+
  5855.  move.l #GA_RelRight,(a6)+ ;tag 2: rel right = -(dnob wd - 1)
  5856.  moveq #1,d0
  5857.  moveq #0,d1
  5858.  move.l xxp_dnob(a2),a0
  5859.  move.w ig_Width(a0),d1
  5860.  sub.l d1,d0
  5861.  move.l d0,(a6)+
  5862.  move.l #GA_RelBottom,(a6)+    ;tag 3: rel bottom = -(dn+sz ob ht -1)
  5863.  moveq #1,d0
  5864.  moveq #0,d1
  5865.  move.l xxp_dnob(a2),a0
  5866.  move.w ig_Height(a0),d1
  5867.  move.l xxp_szob(a2),a0
  5868.  add.w ig_Height(a0),d1
  5869.  sub.l d1,d0
  5870.  move.l d0,(a6)+
  5871.  move.l #GA_RightBorder,(a6)+  ;tag 4: right border = 1
  5872.  move.l #1,(a6)+
  5873.  move.l #GA_Previous,(a6)+ ;tag 5: previous = ^ button
  5874.  move.l xxp_supo(a3),(a6)+
  5875.  move.l #GA_ID,(a6)+       ;tag 6: id = 55
  5876.  move.l #55,(a6)+
  5877.  move.l #ICA_TARGET,(a6)+  ;tag 7: target = idcmp
  5878.  move.l #ICTARGET_IDCMP,(a6)+
  5879.  clr.l (a6)
  5880.  
  5881.  sub.l a0,a0               ;make V object
  5882.  lea .bcls,a1
  5883.  move.l a7,a2
  5884.  move.l xxp_intb(a4),a6
  5885.  jsr _LVONewObjectA(a6)
  5886.  add.w #200,a7
  5887.  move.l d0,xxp_sdno(a3)
  5888.  beq .bad2f
  5889.  
  5890.  move.l xxp_gadb(a4),a6    ;get gadet context
  5891.  move.l a4,a0
  5892.  add.w #xxp_gadg,a0
  5893.  clr.l (a0)
  5894.  jsr _LVOCreateContext(a6)
  5895.  tst.l d0
  5896.  beq .bad2g
  5897.  
  5898.  move.l xxp_gadg(a4),a0      ;daisy chain gadgets together...
  5899.  move.l a0,xxp_gcnt(a3)
  5900.  move.l gg_NextGadget(a0),d0 ;a0 = start gadget; d0 = gadget delimiter
  5901.  
  5902.  move.l xxp_scoh(a3),a2      ;start gad -> horiz scroller
  5903.  move.l a2,gg_NextGadget(a0)
  5904.  move.l a2,a0
  5905.  move.l xxp_slfo(a3),a2      ;horiz slider -> left button
  5906.  move.l a2,gg_NextGadget(a0)
  5907.  move.l a2,a0
  5908.  move.l xxp_srto(a3),a2      ;left button -> right button
  5909.  move.l a2,gg_NextGadget(a0)
  5910.  move.l a2,a0
  5911.  move.l xxp_scov(a3),a2      ;vert slider -> right button
  5912.  move.l a2,gg_NextGadget(a0)
  5913.  move.l a2,a0
  5914.  move.l xxp_supo(a3),a2      ;up button -> vert slider
  5915.  move.l a2,gg_NextGadget(a0)
  5916.  move.l a2,a0
  5917.  move.l xxp_sdno(a3),a2      ;down button -> up button
  5918.  move.l a2,gg_NextGadget(a0)
  5919.  move.l a2,a0
  5920.  move.l d0,gg_NextGadget(a0) ;terminator -> down button
  5921.  
  5922.  bra.s .done               ;return good
  5923.  
  5924. .bad1:                     ;bad 1: out of public mem
  5925.  addq.w #1,xxp_errn+2(a4)
  5926.  bra.s .done
  5927. .bad2g:
  5928.  move.l xxp_sdno(a3),a0
  5929.  jsr _LVODisposeObject(a6)
  5930. .bad2f:
  5931.  move.l xxp_supo(a3),a0
  5932.  jsr _LVODisposeObject(a6)
  5933. .bad2e:
  5934.  move.l xxp_scov(a3),a0
  5935.  jsr _LVODisposeObject(a6)
  5936. .bad2d:
  5937.  move.l xxp_srto(a3),a0
  5938.  jsr _LVODisposeObject(a6)
  5939. .bad2c:
  5940.  move.l xxp_slfo(a3),a0
  5941.  jsr _LVODisposeObject(a6)
  5942. .bad2b:
  5943.  move.l xxp_scoh(a3),a0
  5944.  jsr _LVODisposeObject(a6)
  5945. .bad2a:
  5946.  move.w #38,xxp_errn+2(a4)
  5947. .done:
  5948.  tst.l xxp_errn(a4)                   ;EQ if bad
  5949.  eori.w #-1,ccr
  5950.  bne.s .quit
  5951.  sub.l a3,a3                          ;a3 = 0 if bad
  5952.  moveq #0,d0
  5953. .quit:
  5954.  movem.l (a7)+,d0-d7/a0-a2/a4-a6      ;xxp_scro struct in a3 if good
  5955.  rts
  5956.  
  5957. .gcls: dc.b "propgclass",0
  5958. .bcls: dc.b "buttongclass",0
  5959.   ds.w 0
  5960.  
  5961. *>>>> print IText of currently popped window at position D0,D1
  5962. TLText:
  5963.  movem.l d0-d1/a0-a1/a5-a6,-(a7)      ;save all registers
  5964.  move.l xxp_gfxb(a4),a6
  5965.  
  5966.  move.l xxp_AcWind(a4),a5   ;a5 = window
  5967.  add.w xxp_LeftEdge(a5),d0  ;make d0,d1 rel to printable area of window
  5968.  add.w xxp_TopEdge(a5),d1
  5969.  move.l xxp_WPort(a5),a1    ;set a1 = rastport
  5970.  
  5971.  bsr TLWfont                ;check font, soft style
  5972.  bsr TLWpens                ;set pens, draw mode
  5973.  
  5974.  move.l rp_Font(a1),a0
  5975.  add.w tf_Baseline(a0),d1   ;make d1 rel to baseline
  5976.  
  5977.  jsr _LVOMove(a6)           ;posn rastport for Text
  5978.  
  5979.  move.l xxp_IText(a5),a0    ;a0 = text
  5980.  move.l a0,a1
  5981.  moveq #-1,d0
  5982. .lgth:
  5983.  addq.l #1,d0               ;d0 = text length
  5984.  tst.b (a1)+
  5985.  bne .lgth
  5986.  
  5987.  move.l xxp_WPort(a5),a1    ;a1 = RastPort
  5988.  move.w xxp_Tspc(a5),rp_TxSpacing(a1) ;fix text spacing
  5989.  bsr TLItal                 ;fix xpos if ital
  5990.  
  5991.  jsr _LVOText(a6)
  5992.  movem.l (a7)+,d0-d1/a0-a1/a5-a6
  5993.  rts
  5994.  
  5995. *>>>> fix xpos of italic text   (all regs must be ready for TLText)
  5996. TLItal:
  5997.  btst #1,xxp_Fsty+1(a5)     ;quit quickly unless italic
  5998.  beq.s .quit
  5999.  movem.l d0-d1/a0-a2,-(a7)  ;save all
  6000.  sub.w #te_SIZEOF,a7
  6001.  move.l a7,a2
  6002.  move.l a1,-(a7)
  6003.  jsr _LVOTextExtent(a6)     ;get text extent
  6004.  move.l (a7)+,a1
  6005.  tst.w te_Extent(a7)        ;text minx
  6006.  bpl.s .done                ;ignore if >= 0
  6007.  move.w rp_cp_x(a1),d0
  6008.  sub.w te_Extent(a7),d0     ;bump xpos by xmin
  6009.  move.w rp_cp_y(a1),d1
  6010.  jsr _LVOMove(a6)           ;move right by xmin
  6011. .done:
  6012.  add.w #te_SIZEOF,a7
  6013.  movem.l (a7)+,d0-d1/a0-a2
  6014. .quit:
  6015.  rts
  6016.  
  6017. *>>>> for IText: sets D4=pixel width  D5=no.chrs  D6=YSize  D7=BaseLine
  6018. TLTsize:
  6019.  move.l a5,-(a7)          ;save all exc D4-D7
  6020.  move.l xxp_AcWind(a4),a5 ;A5=currently popped window
  6021.  bsr.s TLThorz            ;get D4-D5
  6022.  bsr.s TLTvert            ;get D6-D7
  6023.  movem.l (a7)+,a5
  6024.  rts
  6025.  
  6026. *>>>> A5 is xxp_wsuw: get TLTsize data, add xxp_xmin,xxp_xmax
  6027. TLTszdo:
  6028.  bsr.s TLThorz              ;get D4-D5
  6029.  add.w xxp_xmin(a5),d4
  6030.  add.w xxp_xmax(a5),d4
  6031.  bsr.s TLTvert              ;get D6-D7
  6032.  rts
  6033.  
  6034. *>>>> A5=xxp_wsuw:  set D4=width of text, D5=no. of chrs
  6035.  
  6036. ; returns d4 = extent of text (including italic tilt, &c)
  6037. ;         xxp_xmin   = xmin (+ve), if TextExtent returned xmin -ve, else 0
  6038. ;         xxp_xmax   = xmax+1- d4, if TextExtent returned xmax+1 > d4
  6039. ;         d5 = number of characters
  6040.  
  6041. TLThorz:
  6042.  movem.l d0-d1/a0-a2/a6,-(a7) ;save all regs except D4,D5
  6043.  bsr TLWfont                ;attach font,style to xxp_WPort if required
  6044.  move.l xxp_IText(a5),a0    ;a0 = text
  6045.  move.l a0,a1
  6046.  moveq #-1,d5
  6047. .count:
  6048.  addq.l #1,d5               ;* d5 = number of characters
  6049.  tst.b (a1)+
  6050.  bne .count
  6051.  move.l xxp_WPort(a5),a1    ;a1 = WPort
  6052.  move.w xxp_Tspc(a5),rp_TxSpacing(a1)
  6053.  sub.w #te_SIZEOF,a7
  6054.  move.l a7,a2
  6055.  move.l xxp_gfxb(a4),a6
  6056.  move.l d5,d0
  6057.  jsr _LVOTextExtent(a6)     ;get TextExtent
  6058.  moveq #0,d4
  6059.  move.w te_Width(a7),d4     ;* d4 = te_Width
  6060.  bpl.s .lhs                 ;  (i.e. the nominal text width)
  6061.  neg.w d4
  6062.  neg.w te_Extent+4(a7)
  6063.  neg.w te_Extent(a7)
  6064. .lhs:
  6065.  move.w te_Extent(a7),d0
  6066.  ble.s .xmin
  6067.  moveq #0,d0
  6068. .xmin:
  6069.  neg.w d0
  6070.  move.w d0,xxp_xmin(a5)     ;* xxp_xmin = xmin (+ve), or 0 if xmin > 0
  6071.  move.w te_Extent+4(a7),d0  ;  (i.e. xxp_xmin = underlap)
  6072.  addq.w #1,d0
  6073.  sub.w d4,d0
  6074.  bpl.s .xmax
  6075.  moveq #0,d0
  6076. .xmax:
  6077.  move.w d0,xxp_xmax(a5)     ;* xxp_xmax = xmax+1-d4, or 0 if d4 > xmax+1
  6078.  add.w #te_SIZEOF,a7        ;  (i.e. xxp_xmax = overlap)
  6079.  movem.l (a7)+,d0-d1/a0-a2/a6
  6080.  rts
  6081.  
  6082. *>>>> A5=IntuiText:  set D6 = height of text  D7 = baseline
  6083. TLTvert:
  6084.  movem.l a0-a1,-(a7)       ;save all regs except result in D6,D7
  6085.  bsr TLWfont               ;ensure font attached
  6086.  move.l xxp_FSuite(a4),a0  ;look up FSuite entry
  6087.  move.w xxp_Fnum(a5),d7
  6088.  mulu #xxp_fsiz,d7
  6089.  move.l xxp_plain(a0,d7.l),a1 ;a1 = font
  6090.  moveq #0,d6
  6091.  moveq #0,d7
  6092.  move.w tf_YSize(a1),d6    ;* d6 = YSize
  6093.  move.w tf_Baseline(a1),d7 ;* d7 = Baseline
  6094.  movem.l (a7)+,a0-a1
  6095.  rts
  6096.  
  6097. *>>>> put font data in TextAttr   A0=FontName, D0=number D1=height
  6098. TLGetfont:
  6099.  bsr TLFsub               ;removes old version (if any)
  6100.  movem.l d0/a0-a1,-(a7)   ;saves all
  6101.  move.l xxp_FSuite(a4),a1 ;a1 = FSuite entry
  6102.  mulu #xxp_fsiz,d0
  6103.  add.l d0,a1
  6104.  clr.w ta_Style(a1)       ;ta_Style,ta_Flags = 0
  6105.  move.w d1,ta_YSize(a1)   ;put height to ta_YSize
  6106.  addq.l #8,a1             ;point to name (ta_SIZEOF = 8)
  6107.  move.l a1,-8(a1)         ;put name back at ta_Name
  6108. .tfr:
  6109.  move.b (a0)+,(a1)+       ;put name (e.g. Topaz.font)
  6110.  bne .tfr
  6111.  movem.l (a7)+,d0/a0-a1
  6112.  rts
  6113.  
  6114. *>>>> call TLNewfont for any xxp_wsuw window a5
  6115. TLAnyfont:
  6116.  move.l xxp_AcWind(a4),-(a7)
  6117.  move.l a5,xxp_AcWind(a4)
  6118.  bsr.s TLNewfont
  6119.  move.l xxp_AcWind(a4),a5
  6120.  move.l (a7)+,xxp_AcWind(a4)
  6121.  tst.l d0                  ;EQ if bad
  6122.  rts
  6123.  
  6124. *>>>> attach font to popped window  D0=num D1=styl D2: 0=window 1=req 2=help
  6125. TLNewfont:
  6126.  movem.l d0/a0/a5,-(a7)    ;save all except result in D0
  6127.  move.l xxp_FSuite(a4),a0
  6128.  mulu #xxp_fsiz,d0         ;* point a0 to FSuite entry
  6129.  add.l d0,a0
  6130.  tst.l xxp_plain(a0)       ;go if plain open
  6131.  bne.s .opln
  6132.  bsr TLOfont               ;open the font
  6133.  beq .bad
  6134. .opln:
  6135.  btst #2,d1                ;(not super/subscript if underline)
  6136.  bne.s .wide
  6137.  btst #3,d1                ;to .supr if super/subscript
  6138.  beq.s .subt
  6139.  btst #4,d1
  6140.  bne.s .wide               ;(but not if both)
  6141.  bra.s .supr
  6142. .subt:
  6143.  btst #4,d1
  6144.  beq.s .wide
  6145. .supr:
  6146.  tst.b d1                  ;to wide if sup/sub + wide
  6147.  bmi.s .wide
  6148.  tst.l xxp_ital(a0)        ;go if half height open
  6149.  bne.s .open
  6150.  move.l (a7),d0            ;d0 = font num
  6151.  bsr TLSuper               ;open half height font
  6152.  beq.s .bad
  6153.  bra.s .open
  6154. .wide:
  6155.  tst.b d1                  ;go if not double width
  6156.  bpl.s .open
  6157.  tst.l xxp_bold(a0)        ;go if double width open
  6158.  bne.s .open
  6159.  move.l (a7),d0            ;d0 = font num
  6160.  bsr TLWide                ;open double width
  6161.  beq.s .bad
  6162. .open:                     ;* font is open
  6163.  move.l (a7),d0            ;d0 = font num
  6164.  move.l xxp_AcWind(a4),a5  ;a5 = active window
  6165.  cmp.w #1,d2               ;test input d2
  6166.  beq.s .req                ;go if req
  6167.  bcc.s .hlp                ;go if help
  6168.  move.w d1,xxp_Fsty(a5)    ;* window: set Fsty
  6169.  tst.w xxp_Attc(a5)
  6170.  bmi.s .set                ;force attach if attach undefined
  6171.  cmp.w xxp_Fnum(a5),d0
  6172.  beq.s .good               ;done if attached, & same Fnum
  6173. .set:
  6174.  move.w d0,xxp_Fnum(a5)    ;note new Fnum
  6175.  move.w #-1,xxp_Attc(a5)   ;force attach font next print
  6176.  bra.s .good
  6177. .req:                      ;* requester
  6178.  move.w d0,xxp_RFont(a5)
  6179.  move.w d1,xxp_RFsty(a5)
  6180.  bra.s .good
  6181. .hlp:                      ;* help
  6182.  move.w d0,xxp_HFont(a5)
  6183.  move.w d1,xxp_HFsty(a5)
  6184. .good:                     ;report success
  6185.  moveq #-1,d0
  6186.  bra.s .done
  6187. .bad:
  6188.  moveq #0,d0
  6189. .done:
  6190.  move.l d0,(a7)            ;result in d0:  EQ=bad  MI=good
  6191.  movem.l (a7)+,d0/a0/a5
  6192.  rts
  6193.  
  6194. *>>>> open a font at a0 in xxp_FSuite
  6195. TLOfont:
  6196.  movem.l d0-d1/a0-a1/a6,-(a7) ;save all
  6197.  clr.l xxp_errn(a4)
  6198.  move.l xxp_sysb(a4),a6
  6199.  lea .libn,a1
  6200.  moveq #36,d0
  6201.  jsr _LVOOpenLibrary(a6)   ;open diskfont.library
  6202.  tst.l d0
  6203.  beq.s .bad1               ;go if can't open diskfont.library
  6204.  move.l d0,a6
  6205.  move.l 8(a7),a0           ;open diskfont
  6206.  jsr _LVOOpenDiskFont(a6)  ;open font
  6207.  move.l d0,-(a7)           ;save result of OpenDiskFont
  6208.  move.l a6,a1
  6209.  move.l xxp_sysb(a4),a6
  6210.  jsr _LVOCloseLibrary(a6)  ;close diskfont.library
  6211.  move.l (a7)+,d0           ;d0 = diskfont
  6212.  beq.s .bad2               ;bad if open failed
  6213.  move.l 8(a7),a0           ;a0 = FSuite entry
  6214.  move.l d0,xxp_plain(a0)   ;save font as opened
  6215.  moveq #-1,d0
  6216.  bra.s .done
  6217. .bad1:                     ;bad 1: can't open diskfont.library
  6218.  moveq #8,d0
  6219.  bra.s .bad
  6220. .bad2:                     ;bad 2: can't open font
  6221.  moveq #10,d0
  6222. .bad:
  6223.  move.l d0,xxp_errn(a4)
  6224.  moveq #0,d0
  6225. .done:
  6226.  movem.l (a7)+,d0-d1/a0-a1/a6 ;EQ=bad, NE=good
  6227.  rts
  6228.  
  6229. .libn: dc.b 'diskfont.library',0
  6230.  ds.w 0
  6231.  
  6232. *>>>> attach Font/Fontstyle to a5's xxp_WPort if required
  6233. TLWfont:
  6234.  move.l d7,-(a7)           ;save all
  6235.  move.w xxp_Fsty(a5),d7    ;already attached?
  6236.  cmp.w xxp_Attc(a5),d7     ;yes, return quickly
  6237.  beq .done
  6238.  
  6239.  movem.l d0-d1/a0-a1/a6,-(a7)
  6240.  move.l xxp_gfxb(a4),a6
  6241.  
  6242.  move.l xxp_FSuite(a4),a1  ;look up the font in FSuite
  6243.  move.w xxp_Fnum(a5),d0
  6244.  move.w d0,d1
  6245.  mulu #xxp_fsiz,d1
  6246.  move.l xxp_plain(a1,d1.l),a0 ;a0 = the font
  6247.  
  6248.  btst #2,d7
  6249.  bne.s .dble               ;(not super or sub if underline)
  6250.  btst #3,d7
  6251.  beq.s .supx               ;go if not superscript
  6252.  btst #4,d7
  6253.  beq.s .supr
  6254.  bra.s .dble               ;(not super or sub if both set)
  6255. .supx:
  6256.  btst #4,d7
  6257.  beq.s .dble
  6258. .supr:                     ;if super/subscript, use half-height font
  6259.  tst.b d7
  6260.  bpl.s .supn               ;go unless sup/sub + wide
  6261.  tst.l xxp_boit(a1,d1.l)
  6262.  bne.s .boit               ;go if sup/sub + wide already opened
  6263.  tst.l xxp_bold(a1,d1.l)
  6264.  bne.s .supn               ;if wide open, but sup/sub not, open failed
  6265.  bsr TLWide                ;open wide, sup/sub + wide
  6266.  tst.l xxp_boit(a1,d1.l)
  6267.  beq.s .supn               ;go if open sup/sub + wide failed
  6268. .boit:
  6269.  move.l xxp_boit(a1,d1.l),a0 ;get sup/sub + wide font
  6270.  bra.s .sngl
  6271. .supn:
  6272.  tst.l xxp_ital(a1,d1.l)
  6273.  bne.s .supp
  6274.  bsr TLSuper               ;open half height font if required
  6275.  beq.s .sngl
  6276. .supp:
  6277.  move.l xxp_ital(a1,d1.l),a0
  6278.  bra.s .sngl
  6279. .dble:                     ;if double, use double width font
  6280.  tst.b d7
  6281.  bpl.s .sngl
  6282.  tst.l xxp_bold(a1,d1.l)
  6283.  bne.s .dblp
  6284.  bsr TLWide                ;open double width font if required
  6285.  beq.s .sngl
  6286. .dblp:
  6287.  move.l xxp_bold(a1,d1.l),a0
  6288.  
  6289. .sngl:
  6290.  move.l xxp_WPort(a5),a1
  6291.  jsr _LVOSetFont(a6)       ;set the font to the WPort
  6292.  move.w d7,xxp_Attc(a5)    ;set the style in Attc
  6293.  beq.s .good               ;go if style is plain
  6294.  
  6295.  moveq #0,d0
  6296.  move.w d7,d0
  6297.  and.w #3,d0
  6298.  lsl.w #1,d0
  6299.  move.l d0,d1
  6300.  move.l xxp_WPort(a5),a1
  6301.  jsr _LVOSetSoftStyle(a6)  ;set the soft style of the attached font
  6302.  
  6303. .good:
  6304.  movem.l (a7)+,d0-d1/a0-a1/a6
  6305.  
  6306. .done:
  6307.  move.l (a7)+,d7
  6308.  rts
  6309.  
  6310. *>>>> attach pens & drmode to a5's xxp_WPort if required
  6311. TLWpens:
  6312.  move.l a1,-(a7)            ;save all
  6313.  move.l d0,-(a7)
  6314.  move.l xxp_WPort(a5),a1    ;a1 = WPort
  6315.  move.w rp_FgPen(a1),d0
  6316.  cmp.w xxp_FrontPen(a5),d0
  6317.  bne.s .cont                ;continue if APen/BPen different
  6318.  move.b rp_DrawMode(a1),d0  ;compare drawmode
  6319.  cmp.b xxp_DrawMode(a5),d0
  6320.  beq.s .done                ;quit quickly if pens, drawmode already set
  6321.  
  6322. .cont:
  6323.  movem.l d1/a0/a6,-(a7)
  6324.  move.l xxp_gfxb(a4),a6
  6325.  moveq #0,d0
  6326.  move.b xxp_FrontPen(a5),d0
  6327.  cmp.b rp_FgPen(a1),d0
  6328.  beq.s .penb                ;go if PenA same
  6329.  jsr _LVOSetAPen(a6)        ;else SetAPen
  6330.  move.l xxp_WPort(a5),a1
  6331.  
  6332. .penb:
  6333.  moveq #0,d0
  6334.  move.b xxp_BackPen(a5),d0
  6335.  cmp.b rp_BgPen(a1),d0
  6336.  beq.s .drmd                ;go if PenB same
  6337.  jsr _LVOSetBPen(a6)        ;else SetBPen
  6338.  move.l xxp_WPort(a5),a1
  6339.  
  6340. .drmd:
  6341.  moveq #0,d0
  6342.  move.b xxp_DrawMode(a5),d0
  6343.  cmp.b rp_DrawMode(a1),d0
  6344.  beq.s .good                ;go if DrawMode same
  6345.  jsr _LVOSetDrMd(a6)        ;else SetDrMd
  6346.  
  6347. .good:
  6348.  movem.l (a7)+,d1/a0/a6
  6349.  
  6350. .done:
  6351.  move.l (a7)+,d0
  6352.  move.l (a7)+,a1
  6353.  rts
  6354.  
  6355. *>>>> close font no. d0 (all styles) - ok if never opened
  6356. TLFsub:
  6357.  movem.l d0-d2/a0-a6,-(a7) ;save all
  6358.  move.l xxp_gfxb(a4),a6
  6359.  move.l xxp_WSuite(a4),a0  ;check not used in window suite
  6360.  moveq #11,d1
  6361. .chek:
  6362.  tst.l xxp_Window(a0)      ;go if window not open
  6363.  beq.s .nxck
  6364.  cmp.w xxp_Fnum(a0),d0     ;main window using?
  6365.  bne.s .req
  6366.  clr.w xxp_Fnum(a0)        ;yes, Topaz/8 it
  6367.  move.w #-1,xxp_Attc(a0)
  6368. .req:
  6369.  cmp.w xxp_RFont(a0),d0    ;req window using?
  6370.  bne.s .hlp
  6371.  clr.w xxp_RFont(a0)       ;yes, Topaz/8 it
  6372. .hlp:
  6373.  cmp.w xxp_HFont(a0),d0    ;help window using?
  6374.  bne.s .nxck
  6375.  clr.w xxp_HFont(a0)       ;yes, Topaz/8 it
  6376. .nxck:
  6377.  add.l #xxp_siz2,a0        ;to next window
  6378.  dbra d1,.chek
  6379.  move.l xxp_FSuite(a4),a3  ;point to FSuite entry
  6380.  mulu #xxp_fsiz,d0
  6381.  add.l d0,a3
  6382.  clr.l (a3)                ;clear 1st long to show doesn't exist
  6383.  move.l xxp_plain(a3),d0   ;get font address
  6384.  beq.s .done               ;go if none
  6385.  move.l d0,a1
  6386.  jsr _LVOCloseFont(a6)     ;close it
  6387.  clr.l xxp_plain(a3)       ;flag closed
  6388.  move.l xxp_bold(a3),d0    ;was double width opened?
  6389.  beq.s .ital               ;no, go
  6390.  move.l d0,a1
  6391.  jsr _LVOCloseFont(a6)     ;yes, close it
  6392.  clr.l xxp_bold(a3)        ;flag closed
  6393. .ital:
  6394.  move.l xxp_ital(a3),d0    ;was superscript opened?
  6395.  beq.s .boit               ;no, go
  6396.  move.l d0,a1
  6397.  jsr _LVOCloseFont(a6)     ;yes, close it
  6398.  clr.l xxp_ital(a3)        ;flag closed
  6399. .boit:
  6400.  move.l xxp_boit(a3),d0    ;was wide/supr opened?
  6401.  beq.s .done               ;no, go
  6402.  move.l d0,a1
  6403.  jsr _LVOCloseFont(a6)     ;yes, close it
  6404.  clr.l xxp_boit(a3)        ;flag closed
  6405. .done:
  6406.  movem.l (a7)+,d0-d2/a0-a6
  6407.  rts
  6408.  
  6409. *>>>> select and load font D0
  6410. TLAslfont:
  6411.  movem.l d1-d7/a0-a6,-(a7) ;save all except d0
  6412.  clr.l xxp_errn(a4)
  6413.  move.l d0,d7              ;save font num
  6414.  move.l xxp_AcWind(a4),a5  ;a5=WSuite ptr
  6415.  move.l xxp_aslb(a4),a6
  6416.  sub.l #4,a7               ;null taglist to AllocAslRequest
  6417.  move.l a7,a0
  6418.  move.l #TAG_DONE,(a0)
  6419.  moveq #ASL_FontRequest,d0
  6420.  jsr _LVOAllocAslRequest(a6)
  6421.  add.l #4,a7
  6422.  tst.l d0
  6423.  beq .bad                  ;bad if can't allocate file request
  6424.  move.l d0,a0              ;FontRequester structure to A0 for AslRequest
  6425.  move.l d0,a3              ;a3=FontRequester structure
  6426.  sub.l #8*8+4,a7           ;room for 8 tags
  6427.  move.l a7,a1
  6428.  move.l #ASL_Hail,(a1)+      ; 1 prompt
  6429.  move.l #.hail,(a1)+
  6430.  move.l #ASL_Window,(a1)+    ; 2 window
  6431.  move.l xxp_Window(a5),(a1)+
  6432.  move.l #ASL_LeftEdge,(a1)+  ; 3 left edge
  6433.  move.l #4,(a1)+
  6434.  move.l #ASL_TopEdge,(a1)+   ; 4 top edge
  6435.  move.l #11,(a1)+
  6436.  move.l #ASL_Width,(a1)+     ; 5 width
  6437.  move.l #320,(a1)+
  6438.  move.l #ASL_Height,(a1)+    ; 6 height
  6439.  move.l xxp_Height(a4),d0
  6440.  sub.w #22,d0
  6441.  move.l d0,(a1)+
  6442.  move.l #ASL_MaxHeight,(a1)+ ; 7 MaxHeight
  6443.  move.l xxp_ehgt(a4),(a1)+
  6444.  move.l #TAG_DONE,(a1)
  6445.  move.l a7,a1 ;point to tags
  6446.  clr.l d0
  6447.  jsr _LVOAslRequest(a6)
  6448.  add.l #8*8+4,a7           ;discard tags
  6449.  tst.l d0
  6450.  beq.s .canc               ;go if cancel selected
  6451.  move.l fo_Attr+ta_Name(a3),a0  ;a0=font name
  6452.  move.w fo_Attr+ta_YSize(a3),d1 ;d1=ysize
  6453.  move.l d7,d0              ;d0=suite num
  6454.  bsr TLGetfont             ;put in suite (& close old version if exists)
  6455.  moveq #-1,d0              ;signal good
  6456.  bra.s .free
  6457. .bad:
  6458.  addq.l #2,xxp_errn(a4)    ;d0=0, errn=2 if can't open requester
  6459.  moveq #0,d0
  6460.  bra.s .quit
  6461. .canc:
  6462.  moveq #0,d0               ;d0=0, errn=0 if cancel
  6463. .free:
  6464.  move.l d0,-(a7)
  6465.  move.l a3,a0
  6466.  move.l xxp_aslb(a4),a6    ;free the AslRequest
  6467.  jsr _LVOFreeAslRequest(a6)
  6468.  move.l (a7)+,d0
  6469. .quit:
  6470.  movem.l (a7)+,d1-d7/a0-a6
  6471.  rts
  6472.  
  6473. .hail: dc.b 'Select a Font',0 ;hail for requester
  6474.  ds.w 0
  6475.  
  6476. *>>>> do file requester d0=strnum of hail a0=file a1=dir  d1= -1save +1load
  6477. TLAslfile:
  6478.  movem.l d1-d7/a0-a6,-(a7) ;saves all except D0
  6479.  movem.l d0-d1/a0-a1,-(a7)
  6480.  clr.l xxp_errn(a4)
  6481.  move.l xxp_aslb(a4),a6
  6482.  jsr _LVOAllocFileRequest(a6)
  6483.  move.l d0,d7        ;request struct to d7
  6484.  movem.l (a7)+,d0-d1/a0-a1
  6485.  beq .quit           ;bad if can't allocate file request
  6486.  subq.l #8,a7        ;OKText to stack
  6487.  move.l a7,d6        ;d6=OKText
  6488.  clr.b 4(a7)
  6489.  move.l #'Save',(a7)
  6490.  cmp.w #-1,d1
  6491.  beq.s .ldsv
  6492.  move.l #'Load',(a7)
  6493. .ldsv:
  6494.  move.l a0,a2         ;point a2 to hail
  6495.  bsr TLStra0
  6496.  exg a0,a2
  6497.  sub.l #10*8+4,a7     ;room for 10 tags
  6498.  move.l a7,a3
  6499.  move.l #ASL_Hail,(a3)+      ; 1
  6500.  move.l a2,(a3)+
  6501.  move.l #ASL_File,(a3)+      ; 2
  6502.  move.l a0,(a3)+
  6503.  move.l #ASL_Dir,(a3)+       ; 3
  6504.  move.l a1,(a3)+
  6505.  tst.l xxp_Screen(a4)        ;go if no screen
  6506.  beq.s .scrn
  6507.  tst.w xxp_Public(a4)        ;go if never initialised
  6508.  ble.s .scrn
  6509.  tst.w xxp_Active(a4)        ;go if no window active
  6510.  bmi.s .scrn
  6511.  move.l xxp_AcWind(a4),a5    ;attach asl to active window
  6512.  move.l #ASL_Window,(a3)+    ; 4
  6513.  move.l xxp_Window(a5),(a3)+
  6514.  move.l #ASL_Width,(a3)+     ; 5
  6515.  move.l #320,(a3)+
  6516.  move.l #ASL_Height,(a3)+    ; 6
  6517.  move.l xxp_Height(a4),d0
  6518.  sub.w #22,d0
  6519.  move.l d0,(a3)+
  6520.  move.l #ASL_TopEdge,(a3)+   ; 7
  6521.  move.l #11,(a3)+
  6522.  move.l #ASL_LeftEdge,(a3)+  ; 8
  6523.  move.l #4,(a3)+
  6524. .scrn:
  6525.  move.l #ASL_OKText,(a3)+    ; 9
  6526.  move.l d6,(a3)+
  6527.  cmp.w #-1,d1
  6528.  bne.s .tags
  6529.  move.l #ASL_FuncFlags,(a3)+ ; 10 (only send if save)
  6530.  move.l #FILF_SAVE,(a3)+
  6531. .tags:
  6532.  move.l #TAG_DONE,(a3)
  6533.  movem.l a0-a1,-(a7)
  6534.  move.l d7,a0
  6535.  move.l a7,a1             ;point to tags
  6536.  jsr _LVOAslRequest(a6)
  6537.  movem.l (a7)+,a0-a1      ;a0=file a1=dir
  6538.  add.l #10*8+4+8,a7       ;discard tags,OKText
  6539.  tst.l d0
  6540.  beq .canc
  6541.  move.l d7,a6             ;a6=FileRequester
  6542.  move.l rf_Dir(a6),a2     ;a2=new dir - put in direct & buff
  6543.  move.l a4,a3             ;point a3 to buff
  6544.  move.l a3,d1             ;d1=buff for AddPart
  6545. .infil:
  6546.  move.b (a2),(a1)+
  6547.  move.b (a2)+,(a3)+
  6548.  bne .infil
  6549.  move.l rf_File(a6),a2    ;a2=new file - put in file
  6550.  move.l a0,d2             ;d2=file part for AddPart
  6551. .fpart:
  6552.  move.b (a2)+,(a0)+
  6553.  bne .fpart
  6554.  move.l xxp_dosb(a4),a6
  6555.  move.w #200,d3
  6556.  jsr _LVOAddPart(a6)      ;path in buff (AddPart can't fail)
  6557.  bsr .free                ;free file request
  6558.  moveq #-1,d0             ;signal good
  6559.  movem.l (a7)+,d1-d7/a0-a6 ;NE if good
  6560.  rts
  6561. .canc:
  6562.  bsr .free                 ;cancel: close file request
  6563.  moveq #0,d0
  6564.  movem.l (a7)+,d1-d7/a0-a6 ;D0=0, errn=0 if cancel
  6565.  rts
  6566. .quit:
  6567.  addq.l #2,xxp_errn(a4)
  6568.  moveq #0,d0
  6569.  movem.l (a7)+,d1-d7/a0-a6 ;D0=0, errn=2 if can't open requester
  6570.  rts
  6571. .free:                     ;** free file request
  6572.  move.l xxp_aslb(a4),a6
  6573.  move.l d7,a0
  6574.  jsr _LVOFreeFileRequest(a6)
  6575.  rts
  6576.  
  6577. *>>>> draw a bevelled box  posn d0,d1  size d2,d3
  6578.  
  6579. ; If bit 31 of D1 set, rastport in A0 (else, use AcWind)
  6580. ; If bit 31 of D0 set, recessed
  6581. ; If bit 30 of D0 set, unbevelled
  6582. ; If bit 29 of D0 set, D4,D5 contain the pen (D4=dark, D5=light)
  6583.  
  6584. TLReqbev:
  6585.  clr.l -(a7)               ;A7 + 60,62 = 0
  6586.  movem.l d0-d7/a0-a6,-(a7) ;save all regs
  6587.  clr.l xxp_errn(a4)
  6588.  
  6589.  tst.l d1                  ;go if writing to window
  6590.  bpl.s .wind
  6591.  
  6592.  bclr #31,d1               ;* writing to rastport...  when 4(a7) is MI
  6593.  move.l a0,a2              ;a2 = rastport
  6594.  bra.s .both
  6595.  
  6596. .wind:                     ;* writing to window...    when 4(a7) is PL
  6597.  move.l xxp_AcWind(a4),a5
  6598.  move.l xxp_WPort(a5),a2   ;a2 = window's rastport
  6599.  move.w xxp_PWidth(a5),d6
  6600.  sub.w d0,d6               ;d6 = max allowable width
  6601.  bmi .done                 ;done if off rhs
  6602.  cmp.w d2,d6
  6603.  bcc.s .wdok
  6604.  move.w d6,d2              ;trim if too wide, & set 60(a7)<>
  6605.  subq.w #1,60(a7)
  6606. .wdok:
  6607.  move.w xxp_PHeight(a5),d6 ;d6 = max allowable height
  6608.  sub.w d1,d6               ;done if off bot
  6609.  bmi .done
  6610.  cmp.w d3,d6
  6611.  bcc.s .htok
  6612.  move.w d6,d3              ;trim if too high, & set 62(a7)<>
  6613.  subq.w #1,62(a7)
  6614. .htok:
  6615.  add.w xxp_LeftEdge(a5),d0 ;offset d0,d1 by left & top borders
  6616.  add.w xxp_TopEdge(a5),d1
  6617.  
  6618. .both:                     ;d2,d3 = rhs,bot pixel posns
  6619.  add.w d0,d2
  6620.  subq.w #1,d2
  6621.  add.w d1,d3
  6622.  subq.w #1,d3
  6623.  
  6624.  btst #29,d0               ;if D0 bit 29 unset, pens 1,2
  6625.  bne.s .clok
  6626.  moveq #1,d4               ;d4 = dark pen
  6627.  moveq #2,d5               ;d5 = light pen
  6628. .clok:
  6629.  tst.l d0                  ;if D0 bit 30 set, recessed -> swap pens
  6630.  bpl.s .nrec
  6631.  exg d4,d5
  6632. .nrec:
  6633.  btst #30,d0               ;if bit 30 set, box -> both pens are dark pen
  6634.  beq.s .nbox
  6635.  move.l d4,d5
  6636. .nbox:
  6637.  
  6638.  and.l #$FFFF,d0
  6639.  move.l d0,d6              ;d6 = lhs   d2 = rhs
  6640.  move.l d1,d7              ;d7 = top   d3 = bot
  6641.  
  6642.  move.l xxp_gfxb(a4),a6    ;set light pen, jam2
  6643.  moveq #0,d0
  6644.  move.b d5,d0
  6645.  move.l a2,a1
  6646.  jsr _LVOSetAPen(a6)
  6647.  move.l a2,a1
  6648.  moveq #RP_JAM2,d0
  6649.  jsr _LVOSetDrMd(a6)
  6650.  
  6651.  cmp.w d2,d6               ;go if only 1 pixel either way
  6652.  beq.s .box1
  6653.  cmp.w d3,d7
  6654.  beq.s .box1
  6655.  
  6656.  move.l d6,d0              ;move to 1 pixel SE from top left
  6657.  addq.l #1,d0
  6658.  move.l d7,d1
  6659.  addq.l #1,d1
  6660.  move.l a2,a1
  6661.  jsr _LVOMove(a6)
  6662.  move.l d6,d0              ;point to 1 pixel NE from bot left
  6663.  addq.l #1,d0
  6664.  move.l d3,d1
  6665.  tst.w 62(a7)              ;if bot trimmed, 1 pixel E
  6666.  bne.s .box0
  6667.  subq.l #1,d1
  6668. .box0:
  6669.  move.l a2,a1
  6670.  tst.w 4(a7)               ;bad if window & resized
  6671.  bmi.s .do0
  6672.  bsr TLWCheck
  6673.  bne .bad
  6674. .do0:
  6675.  jsr _LVODraw(a6)          ;* draw left inner line
  6676.  
  6677. .box1:                     ;move to bottom left
  6678.  move.l d6,d0
  6679.  move.l d3,d1
  6680.  move.l a2,a1
  6681.  jsr _LVOMove(a6)          ;* move to bottom left
  6682.  
  6683.  cmp.w d3,d7               ;go if height = 1 (when also at top left)
  6684.  beq.s .box2
  6685.  
  6686.  move.l d6,d0              ;point to top left
  6687.  move.l d7,d1
  6688.  move.l a2,a1
  6689.  tst.w 4(a7)               ;bad if window & resized
  6690.  bmi.s .do1
  6691.  bsr TLWCheck
  6692.  bne .bad
  6693. .do1:
  6694.  jsr _LVODraw(a6)          ;* draw from bottom left to top left
  6695.  
  6696.  cmp.w d2,d6               ;quit if width = 1
  6697.  beq .done
  6698.  
  6699. .box2:                     ;point to 1 pixel W of top right
  6700.  move.l d2,d0
  6701.  tst.w 60(a7)
  6702.  bmi.s .box3               ;top right if trimmed horz
  6703.  cmp.w d3,d7
  6704.  beq.s .box3               ;top right if height = 1
  6705.  subq.w #1,d0
  6706. .box3:
  6707.  move.l d7,d1
  6708.  move.l a2,a1
  6709.  tst.w 4(a7)               ; bad if window & resized
  6710.  bmi.s .do2
  6711.  bsr TLWCheck
  6712.  bne .bad
  6713. .do2:
  6714.  jsr _LVODraw(a6)          ;* draw from top left to top right
  6715.  
  6716.  cmp.w d3,d7               ;quit if height = 1
  6717.  beq .done
  6718.  
  6719.  moveq #0,d0               ;* set dark pen
  6720.  move.b d4,d0
  6721.  move.l a2,a1
  6722.  jsr _LVOSetAPen(a6)
  6723.  
  6724.  tst.w 60(a7)              ;if trimmed horz, move to bot right & skip
  6725.  beq.s .cnt1
  6726.  move.l d2,d0
  6727.  move.l d3,d1
  6728.  move.l a2,a1
  6729.  jsr _LVOMove(a6)
  6730.  bra.s .pik1
  6731.  
  6732. .cnt1:                     ;point to top right
  6733.  move.l d2,d0
  6734.  move.l d7,d1
  6735.  move.l a2,a1
  6736.  jsr _LVOMove(a6)          ;* move to top right
  6737.  
  6738.  move.l d2,d0              ;point to bot right
  6739.  move.l d3,d1
  6740.  move.l a2,a1
  6741.  tst.w 4(a7)               ;bad if window & resized
  6742.  bmi.s .do3
  6743.  bsr TLWCheck
  6744.  bne.s .bad
  6745. .do3:
  6746.  jsr _LVODraw(a6)          ;* draw rhs
  6747.  
  6748. .pik1:                     ;go if trimmed vert
  6749.  tst.w 62(a7)
  6750.  bne.s .pik2
  6751.  
  6752.  move.l d6,d0              ;point 1 pixel E of bottom left
  6753.  addq.l #1,d0
  6754.  move.l d3,d1
  6755.  move.l a2,a1
  6756.  tst.w 4(a7)               ;bad if window resized
  6757.  bmi.s .do4
  6758.  bsr TLWCheck
  6759.  bne.s .bad
  6760. .do4:
  6761.  jsr _LVODraw(a6)          ;* draw bottom line
  6762.  
  6763. .pik2:
  6764.  tst.w 60(a7)              ;done if trimmed horz
  6765.  bne.s .done
  6766.  
  6767.  move.l d2,d0              ;move to 1 pixel SW of top right
  6768.  subq.l #1,d0
  6769.  move.l d7,d1
  6770.  addq.l #1,d1
  6771.  move.l a2,a1
  6772.  jsr _LVOMove(a6)          ;* move to top of right inside line
  6773.  
  6774.  move.l d2,d0              ;point to 1 pixel NW of bot right
  6775.  subq.l #1,d0
  6776.  move.l d3,d1
  6777.  subq.w #1,d1
  6778.  move.l a2,a1
  6779.  tst.w 4(a7)               ;bad if window & resized
  6780.  bmi.s .do6
  6781.  bsr TLWCheck
  6782.  bne.s .bad
  6783. .do6:
  6784.  jsr _LVODraw(a6)          ;* draw right inside line
  6785.  bra.s .done
  6786.  
  6787. .bad:                      ;bad: window resized
  6788.  move.w #35,xxp_errn+2(a4)
  6789.  
  6790. .done:
  6791.  movem.l (a7)+,d0-d7/a0-a6
  6792.  addq.l #4,a7
  6793.  tst.l xxp_errn(a4)        ;EQ, xxp_errn<>0 if bad
  6794.  eori.w #-1,CCR
  6795.  rts
  6796.  
  6797. *>>>> draw an area  posn D0,D1  size D2,D3    EQ if resized
  6798.  
  6799. ; if bit 29 of D0 set, colour in D4   (else xxp_Backpen window, 0 rastport)
  6800. ; if bit 31 of D1 set, rastport in A0 (else is AcWind)
  6801.  
  6802. TLReqarea:
  6803.  movem.l d0-d5/a0-a1/a5-a6,-(a7) ;saves all regs
  6804.  clr.l xxp_errn(a4)
  6805.  
  6806.  tst.l d1                  ;go if drawing to window
  6807.  bpl.s .wind
  6808.  
  6809.  bclr #31,d1               ;* drawing to rastport
  6810.  move.l a0,a1
  6811.  btst #29,d0
  6812.  bne.s .both
  6813.  moveq #0,d4               ;pen = 0 if not specified
  6814.  bra.s .both
  6815.  
  6816. .wind:                     ;* drawing to window
  6817.  move.l xxp_AcWind(a4),a5
  6818.  move.w xxp_PWidth(a5),d5  ;d5 = max allowable width
  6819.  sub.w d0,d5
  6820.  bcs.s .done               ;quit if off rhs
  6821.  cmp.w d2,d5
  6822.  bcc.s .xwok
  6823.  move.w d5,d2              ;trim if width > max allowable
  6824. .xwok:
  6825.  move.w xxp_PHeight(a5),d5 ;d5 = max allowable height
  6826.  sub.w d1,d5
  6827.  bcs.s .done               ;quit if off bottom
  6828.  cmp.w d3,d5
  6829.  bcc.s .yhok
  6830.  move.w d5,d3              ;trim if height > max allowable
  6831. .yhok:
  6832.  add.w xxp_LeftEdge(a5),d0 ;make d0,d1 rel to window border
  6833.  add.w xxp_TopEdge(a5),d1
  6834.  move.l xxp_WPort(a5),a1
  6835.  btst #29,d0
  6836.  bne.s .both
  6837.  move.b xxp_BackPen(a5),d4 ;pen = back pen if not specified
  6838.  
  6839. .both:                     ;prepare d2,d3 for rectfill
  6840.  add.w d0,d2
  6841.  subq.w #1,d2
  6842.  add.w d1,d3
  6843.  subq.w #1,d3
  6844.  
  6845.  move.l xxp_gfxb(a4),a6    ;set pen A to D4
  6846.  movem.l d0-d1/a1,-(a7)
  6847.  moveq #0,d0
  6848.  move.b d4,d0
  6849.  jsr _LVOSetAPen(a6)
  6850.  movem.l (a7)+,d0-d1/a1
  6851.  
  6852.  tst.l 4(a7)               ;if window, bad if resized
  6853.  bmi.s .do
  6854.  bsr TLWCheck
  6855.  bne.s .bad
  6856. .do
  6857.  jsr _LVORectFill(a6)      ;draw the area
  6858.  bra.s .done
  6859.  
  6860. .bad:
  6861.  move.w #35,xxp_errn+2(a4)
  6862.  
  6863. .done:
  6864.  movem.l (a7)+,d0-d5/a0-a1/a5-a6
  6865.  tst.l xxp_errn(a4)
  6866.  eori.w #1,CCR            ;xxp_errn<>0, EQ if bad
  6867.  rts
  6868.  
  6869. *>>>> clear Window (calls TLWupdate)
  6870. TLReqcls:
  6871.  movem.l d0-d7/a0-a6,-(a7)   ;saves all regs
  6872.  move.l xxp_AcWind(a4),a5
  6873.  bsr TLWupdate
  6874.  moveq #0,d0
  6875.  moveq #0,d1
  6876.  move.w xxp_PWidth(a5),d2
  6877.  move.w xxp_PHeight(a5),d3
  6878.  moveq #0,d4
  6879.  bset #29,d0
  6880.  bsr TLReqarea
  6881.  movem.l (a7)+,d0-d7/a0-a6
  6882.  rts
  6883.  
  6884. *>>>> make window full size
  6885. TLReqfull:
  6886.  movem.l d0-d3/a0-a1/a5-a6,-(a7) ;saves all regs
  6887.  move.l xxp_intb(a4),a6
  6888.  move.l xxp_AcWind(a4),a5
  6889.  bsr TLWfront
  6890.  moveq #0,d0
  6891.  moveq #0,d1
  6892.  moveq #0,d2
  6893.  moveq #0,d3
  6894.  move.l xxp_Window(a5),a0
  6895.  move.w wd_MaxWidth(a0),d2
  6896.  move.w wd_MaxHeight(a0),d3
  6897.  jsr _LVOChangeWindowBox(a6)     ;request change to full size
  6898. .wait:
  6899.  move.l xxp_gfxb(a4),a6
  6900.  jsr _LVOWaitTOF(a6)             ;wait until change takes effect
  6901.  move.l xxp_Window(a5),a0
  6902.  move.w wd_Width(a0),d0
  6903.  cmp.w wd_MaxWidth(a0),d0
  6904.  bne .wait
  6905.  move.w wd_Height(a0),d0
  6906.  cmp.w wd_MaxHeight(a0),d0
  6907.  bne .wait
  6908.  bsr TLWupdate
  6909.  movem.l (a7)+,d0-d3/a0-a1/a5-a6
  6910.  rts
  6911.  
  6912. *>>>> update window printable area
  6913. TLWupdate:
  6914.  movem.l d0/a0/a5,-(a7)      ;saves all regs
  6915.  move.l xxp_AcWind(a4),a5    ;a5=window in WSuite
  6916.  move.l xxp_Window(a5),a0    ;a0=window
  6917.  move.l wd_Width(a0),xxp_Wcheck(a5) ;save init window dims
  6918.  moveq #0,d0                 ;update xxp_PWidth,Height
  6919.  move.b wd_BorderLeft(a0),d0
  6920.  add.b wd_BorderRight(a0),d0
  6921.  neg.w d0
  6922.  add.w xxp_Wcheck(a5),d0
  6923.  move.w d0,xxp_PWidth(a5)
  6924.  moveq #0,d0
  6925.  move.b wd_BorderTop(a0),d0
  6926.  add.b wd_BorderBottom(a0),d0
  6927.  neg.w d0
  6928.  add.w xxp_Wcheck+2(a5),d0
  6929.  move.w d0,xxp_PHeight(a5)
  6930. .done:
  6931.  movem.l (a7)+,d0/a0/a5
  6932.  rts
  6933.  
  6934. *>>>> set d0<>0 if window size has changed since TLWupdate called
  6935. TLWcheck:
  6936.  movem.l a0/a5,-(a7)       ;saves all exc d0
  6937.  move.l xxp_AcWind(a4),a5
  6938.  move.l xxp_Window(a5),a0
  6939.  move.l wd_Width(a0),d0
  6940.  sub.l xxp_Wcheck(a5),d0   ;D0=diff in window size
  6941.  movem.l (a7)+,a0/a5
  6942.  rts
  6943.  
  6944. *>>>> Internal call of TLWcheck
  6945. TLWCheck:
  6946.  movem.l d0-d1,-(a7)
  6947.  bsr TLWcheck
  6948.  tst.l d0                  ;NE if size changed
  6949.  movem.l (a7)+,d0-d1
  6950.  rts
  6951.  
  6952. *>>>> set xxp_Pop for requesters, & call TLReqint (part xxp_wsuw in a5)
  6953. TLReqredi:
  6954.  movem.l d0-d1/a0,-(a7)    ;saves all
  6955.  
  6956.  move.l #$03020100,xxp_prfp(a4) ;defaults to prfp for custom requesters
  6957.  clr.l xxp_prfp+4(a4)
  6958.  move.w xxp_Active(a4),xxp_Pop(a4) ;set xxp_Pop
  6959.  
  6960.  move.b xxp_prfp+1(a4),xxp_FrontPen(a5) ;fix data in dummy wsuw
  6961.  move.b xxp_prfp(a4),xxp_BackPen(a5)
  6962.  move.b #RP_JAM2,xxp_DrawMode(a5)       ;jam2
  6963.  clr.l xxp_LeftEdge(a5)                 ;posn 0,0
  6964.  
  6965.  move.w #10,xxp_Fnum(a5)   ;set prefs fnum,fsty,tspc
  6966.  move.l xxp_pref(a4),a0    ;(will be over-ridden if pop window)
  6967.  clr.w xxp_Fsty(a5)
  6968.  move.b xxp_ysty(a0),xxp_Fsty+1(a5)
  6969.  clr.w xxp_Tspc(a5)
  6970.  move.b xxp_yspc(a0),xxp_Tspc+1(a5)
  6971.  move.l xxp_FSuite(a4),a0
  6972.  tst.l xxp_fsiz*10(a0)
  6973.  bne.s .f0
  6974.  clr.w xxp_Fnum(a5)        ;(or Topaz/8 if no font 10)
  6975.  clr.w xxp_Fsty(a5)
  6976.  clr.w xxp_Tspc(a5)
  6977. .f0:
  6978.  
  6979.  move.w #-1,xxp_Attc(a5)
  6980.  move.w xxp_Pop(a4),d0     ;get pop window
  6981.  bmi.s .fsty               ;go if none
  6982.  mulu #xxp_siz2,d0         ;a0=pop window
  6983.  move.l xxp_WSuite(a4),a0
  6984.  add.l d0,a0
  6985.  move.w xxp_RTspc(a0),xxp_Tspc(a5)  ;but if pop window, use its fnum &c
  6986.  move.w xxp_RFsty(a0),xxp_Fsty(a5)
  6987.  move.w xxp_RFont(a0),xxp_Fnum(a5)
  6988. .fsty:
  6989.  
  6990.  move.l a4,xxp_IText(a5)   ;text from buff
  6991.  
  6992.  move.l xxp_ERport(a4),xxp_WPort(a5)  ;use xxp_ERport as sub for xxp_WPort
  6993.  movem.l (a7)+,d0-d1/a0
  6994.  rts
  6995.  
  6996. *>>>> choose from D1 choices: D0=str num of header, then D1 choices
  6997. ; (if D1=0, 1 choice only, in buff, D0 ignored)
  6998. TLReqchoose:
  6999.  
  7000.  move.l xxp_butx(a4),-(a7) ;save button data
  7001.  move.l xxp_buty(a4),-(a7)
  7002.  move.l xxp_butw(a4),-(a7)
  7003.  move.l xxp_buth(a4),-(a7)
  7004.  move.l xxp_btdx(a4),-(a7)
  7005.  move.l xxp_btdy(a4),-(a7)
  7006.  move.l xxp_butk(a4),-(a7)
  7007.  move.l xxp_butl(a4),-(a7)
  7008.  
  7009.  movem.l d0-d7/a0-a6,-(a7) ;save all except result in D0
  7010.  move.l a7,xxp_Stak(a4)
  7011.  move.l xxp_strg(a4),-(a7) ;save global strings
  7012.  movem.l d0-d1,-(a7)       ;save input d0,1
  7013.  sub.w #100,a7             ;room for dummy strings if D1=-1
  7014.  sub.w #xxp_WPort+4,a7     ;room for dummy part xxp_Wsuw
  7015.  
  7016.  move.l a7,a5              ;a5 points to dummy IntuiText
  7017.  bsr TLReqredi             ;set pop window
  7018.  beq .bad                  ;bad if can't - unlikely
  7019.  
  7020.  move.l xxp_pref(a4),a0    ;get prefs data
  7021.  move.l xxp_ychs(a0),xxp_prfp(a4)
  7022.  move.l xxp_ychs+4(a0),xxp_prfp+4(a4)
  7023.  
  7024.  tst.w d1                  ;if D1=-0, make dummy strings in stack
  7025.  bne.s .rcyc
  7026.  move.l a7,a1
  7027.  add.w #xxp_WPort+4,a1
  7028.  move.l a1,xxp_strg(a4)
  7029.  clr.b (a1)+
  7030.  lea .ack,a0
  7031. .dum0:
  7032.  move.b (a0)+,(a1)+
  7033.  bne .dum0
  7034.  move.l a4,a0
  7035.  clr.b 76(a0)
  7036. .dum1:
  7037.  move.b (a0)+,(a1)+
  7038.  bne .dum1
  7039.  move.l #1,xxp_WPort+104(a7) ;& as if input was 1,1 in dummy strings
  7040.  move.l #1,xxp_WPort+108(a7)
  7041.  
  7042. .rcyc:                     ;* here to try if will fit
  7043.  move.l xxp_WPort+104(a7),d0
  7044.  move.l xxp_WPort+108(a7),d1 ;retrieve input d0,d1
  7045.  
  7046.  bsr TLStra0               ;get button dimensions
  7047.  move.l a0,a1
  7048.  lea .fns,a0
  7049.  move.l xxp_AcWind(a4),-(a7)
  7050.  move.l a5,xxp_AcWind(a4)
  7051.  bsr TLButstr
  7052.  move.l (a7)+,xxp_AcWind(a4)
  7053.  
  7054.  move.l a1,a0
  7055.  
  7056.  move.l #1,xxp_butk(a4)    ;complete button data
  7057.  move.l d1,xxp_butl(a4)
  7058.  move.l #2,xxp_butx(a4)
  7059.  move.l xxp_buth(a4),xxp_buty(a4)
  7060.  addq.l #1,xxp_buty(a4)
  7061.  clr.l xxp_btdx(a4)
  7062.  move.l xxp_buth(a4),xxp_btdy(a4)
  7063.  moveq #0,d3
  7064.  move.b xxp_prfp+3(a4),d3  ;width + pref horz
  7065.  add.l d3,xxp_butx(a4)
  7066.  move.b xxp_prfp+4(a4),d3  ;dy + pref vert
  7067.  add.l d3,xxp_btdy(a4)
  7068.  
  7069.  move.l d1,d3              ;set D2 = wdth of widest of header-butw, strings
  7070.  moveq #0,d2
  7071.  move.l a1,xxp_IText(a5)
  7072.  bsr TLTszdo
  7073.  sub.l xxp_butw(a4),d4
  7074.  bcc.s .widp
  7075.  bra.s .widc
  7076. .wide:
  7077.  move.l a1,xxp_IText(a5)
  7078.  bsr TLTszdo
  7079.  cmp.w d4,d2
  7080.  bcc.s .widc
  7081. .widp:
  7082.  move.w d4,d2
  7083. .widc:
  7084.  tst.b (a1)+
  7085.  bne .widc
  7086.  dbra d3,.wide
  7087.  add.l xxp_butx(a4),d2     ;add button offset
  7088.  add.l xxp_butw(a4),d2     ;add button width
  7089.  addq.l #6,d2              ;add (button) - 2 - (text) - 4 - (rhs)
  7090.  
  7091.  cmp.l xxp_Width(a4),d2    ;go unless too wide
  7092.  ble.s .wdok
  7093.  tst.b xxp_prfp+3(a4)
  7094.  beq.s .wfx1
  7095.  subq.b #1,xxp_prfp+3(a4)      ;if horz gap <> 0, dec horz gap & retry
  7096.  bra .rcyc
  7097. .wfx1:
  7098.  tst.w xxp_Tspc(a5)        ;if Tspc <> 0, dec Tspc & retry
  7099.  beq.s .wfx2
  7100.  subq.w #1,xxp_Tspc(a5)
  7101.  bra .rcyc
  7102. .wfx2:
  7103.  tst.w xxp_Fnum(a5)        ;if Fnum <> 0, retry w. Fnum = 0
  7104.  beq.s .wdok               ;(else, will be bad)
  7105.  
  7106. .pfxf:
  7107.  moveq #0,d0               ;attach font 0 to dummy xxp_wsuw
  7108.  moveq #0,d1               ;(will be passed on by TLReqon)
  7109.  moveq #0,d2
  7110.  bsr TLAnyfont
  7111.  bne .rcyc
  7112. .wdok:
  7113.  
  7114.  move.l xxp_btdy(a4),d3    ;calculate requester height
  7115.  addq.w #1,d1
  7116.  mulu d1,d3
  7117.  subq.w #1,d1
  7118.  moveq #0,d0               ;d3 = btdy * no. of lines - pref vert
  7119.  move.b xxp_prfp+4(a4),d0
  7120.  sub.l d0,d3
  7121.  addq.l #2,d3              ;add  (top) - 1 - (title) - 0 - (...) - 1 - (bot)
  7122.  
  7123.  cmp.l xxp_Height(a4),d3   ;go unless requester too deep
  7124.  ble.s .htok
  7125.  tst.b xxp_prfp+4(a4)      ;if  horz vert <> 0, dec horz vert & retry
  7126.  beq.s .hfx1
  7127.  subq.b #1,xxp_prfp+4(a4)
  7128.  bra .rcyc
  7129. .hfx1:
  7130.  tst.w xxp_Fnum(a5)        ;if Fnum <> 0, retry w. Fnum = 0
  7131.  bne .pfxf                 ;(else, will be bad)
  7132. .htok:
  7133.  
  7134.  bsr TLReqchek             ;check requester size & posn
  7135.  beq .bad
  7136.  tst.w xxp_ReqNull(a4)     ;go if null
  7137.  beq .null
  7138.  
  7139.  bsr TLReqon               ;window on
  7140.  beq .bad                  ;go if can't
  7141.  move.l d1,d2              ;d2 = no. of strings
  7142.  
  7143.  bsr TLButprt              ;print buttons & buttons text
  7144.  move.l a0,a1
  7145.  move.b xxp_prfp+2(a4),xxp_FrontPen(a5)
  7146.  move.b xxp_prfp(a4),xxp_BackPen(a5)
  7147.  lea .fns,a0
  7148.  bsr TLButtxt              ;print buttons text
  7149.  move.l a1,a0
  7150.  
  7151.  moveq #2,d0               ;print header
  7152.  add.l xxp_butx(a4),d0
  7153.  moveq #2,d1
  7154.  move.b xxp_prfp+1(a4),xxp_FrontPen(a5)
  7155.  move.l a1,xxp_IText(a5)
  7156.  bsr TLText
  7157.  add.l xxp_butw(a4),d0
  7158.  moveq #0,d3
  7159.  move.b xxp_prfp+4(a4),d3
  7160.  sub.l d3,d1
  7161.  move.b xxp_prfp+2(a4),xxp_FrontPen(a5)
  7162.  bra.s .fore
  7163.  
  7164. .strg:                     ;print strings
  7165.  move.l a1,xxp_IText(a5)
  7166.  bsr TLText
  7167. .fore:
  7168.  tst.b (a1)+
  7169.  bne .fore
  7170.  add.l xxp_btdy(a4),d1
  7171.  dbra d2,.strg
  7172.  
  7173.  bsr TLHook2               ;call xxp_hook2 if any
  7174.  move.l xxp_WPort+112(a7),xxp_strg(a4) ;restore xxp_strg from stack
  7175.  
  7176. .wait:
  7177.  move.l xxp_strg(a4),-(a7) ;attach default help if none
  7178.  move.l xxp_Help(a4),-(a7)
  7179.  bne.s .wtdo
  7180.  move.l #.str,xxp_strg(a4)
  7181.  move.l #$00010009,xxp_Help(a4)
  7182. .wtdo:
  7183.  bsr TLWfront
  7184.  bsr TLKeyboard            ;wait for response
  7185.  move.l (a7)+,xxp_Help(a4)
  7186.  move.l (a7)+,xxp_strg(a4)
  7187.  cmp.b #$81,d0             ;go if not Fn key
  7188.  bcs.s .clik
  7189.  sub.b #$81,d0
  7190.  cmp.w xxp_butl+2(a4),d0
  7191.  bcc .wait
  7192.  addq.w #1,d0
  7193.  bra.s .close              ;D0=choice
  7194. .clik:
  7195.  cmp.b #$80,d0             ;redo if not lmb
  7196.  bne .wait
  7197.  bsr TLButmon              ;D0=1+ if button clicked
  7198.  tst.w d0
  7199.  beq .wait                 ;go if not in button
  7200. .close:
  7201.  bsr TLReqoff              ;close requester window, pop old window if any
  7202.  bra.s .done
  7203.  
  7204. .bad:                      ;bad if too big / can't open window
  7205.  moveq #0,d0
  7206.  bra.s .done
  7207.  
  7208. .null:                     ;here if xxp_ReqNull was 0
  7209.  subq.w #1,xxp_ReqNull(a4) ;leave xxp_ReqNull <> 0
  7210.  moveq #1,d0               ;dummy choice = 1
  7211.  
  7212. .done:
  7213.  bsr TLWslof               ;clear all message buffers
  7214.  add.w #xxp_WPort+4,a7     ;remove dummy IntuiText
  7215.  add.w #100,a7             ;slough dummy strings
  7216.  addq.l #8,a7              ;slough input d0,d1
  7217.  move.l (a7)+,xxp_strg(a4) ;restore global strings
  7218.  move.l d0,(a7)
  7219.  
  7220.  movem.l (a7)+,d0-d7/a0-a6
  7221.  
  7222.  move.l (a7)+,xxp_butl(a4) ;restore button data
  7223.  move.l (a7)+,xxp_butk(a4)
  7224.  move.l (a7)+,xxp_btdy(a4)
  7225.  move.l (a7)+,xxp_btdx(a4)
  7226.  move.l (a7)+,xxp_buth(a4)
  7227.  move.l (a7)+,xxp_butw(a4)
  7228.  move.l (a7)+,xxp_buty(a4)
  7229.  move.l (a7)+,xxp_butx(a4)
  7230.  
  7231.  tst.l d0                  ;EQ, D0=0 if bad, else 1+ = choice
  7232.  rts
  7233.  
  7234. .str: dc.b 0
  7235.  dc.b 'You are requested to choose 1 item from the list of alternatives.',0
  7236.  dc.b 'Make your choice by clicking one of the left hand buttons.',0 ;2
  7237.  dc.b 'Or, you can press a Function key as shown within the button.',0 ;3
  7238.  dc.b 0 ;4
  7239.  dc.b '(If there are more than 9 choices you can only choose among the',0 ;5
  7240.  dc.b 'first 9 by means of Function keys.)',0 ;6
  7241.  dc.b 0 ;7
  7242.  dc.b '(If you have attached hotkeys to the Function keys, then of course',0
  7243.  dc.b 'you should choose by clicking a button, not by function key.)',0 ;9
  7244.  ds.w 0
  7245.  
  7246. .ack: dc.b 'Click to acknowledge',0
  7247. .fns: dc.b 'F1\F2\F3\F4\F5\F6\F7\F8\F9\F0',0
  7248.  ds.w 0
  7249.  
  7250. *>>>> input a string/num  D0=header strnum D1=0str/-1num/+1hex D2=num chrs
  7251. ;                         D3=0 calculate width;  D3<>0 =width
  7252. TLReqinput:
  7253.  move.l xxp_butx(a4),-(a7) ;save button data
  7254.  move.l xxp_buty(a4),-(a7)
  7255.  move.l xxp_butw(a4),-(a7)
  7256.  move.l xxp_buth(a4),-(a7)
  7257.  move.l xxp_btdx(a4),-(a7)
  7258.  move.l xxp_btdy(a4),-(a7)
  7259.  move.l xxp_butk(a4),-(a7)
  7260.  move.l xxp_butl(a4),-(a7)
  7261.  
  7262.  movem.l d0-d7/a0-a6,-(a7) ;save all except result in D0
  7263.  move.l a7,xxp_Stak(a4)
  7264.  clr.l xxp_errn(a4)
  7265.  sub.w #xxp_WPort+4,a7     ;create dummy part xxp_wsuw
  7266.  
  7267.  move.l a7,a5              ;set pop window
  7268.  bsr TLReqredi
  7269.  beq .bad
  7270.  
  7271.  move.l xxp_pref(a4),a0    ;prefs to prfp
  7272.  move.l xxp_yinp(a0),xxp_prfp(a4)
  7273.  move.l xxp_yinp+4(a0),xxp_prfp+4(a4)
  7274.  
  7275. .rcyc:                     ;see if will fit...
  7276.  move.l xxp_WPort+4(a7),d0
  7277.  move.l xxp_WPort+8(a7),d1
  7278.  move.l xxp_WPort+12(a7),d2
  7279.  move.l xxp_WPort+16(a7),d3
  7280.  
  7281.  moveq #0,d4               ;set d3 to minimum tablet width
  7282.  move.w d3,d4
  7283.  bne.s .wdgt               ;go if set in D3
  7284.  move.l (a4),-(a7)
  7285.  move.b #'N',(a4)
  7286.  clr.b 1(a4)
  7287.  move.l a4,xxp_IText(a5)
  7288.  bsr TLTszdo               ;else set width to D2+1 ens
  7289.  move.l (a7)+,(a4)
  7290.  addq.w #1,d2
  7291.  mulu d2,d4
  7292.  subq.w #1,d2
  7293. .wdgt:
  7294.  move.l d4,d3              ;d3 = minimum tablet width
  7295.  
  7296.  bsr TLStra0               ;set d6 to header width, a3 to header
  7297.  move.l a0,a3
  7298.  move.l a0,xxp_IText(a5)
  7299.  bsr TLTszdo               ;set D4 to header width, D6 to header height
  7300.  move.l d3,d7              ;set D7 to tablet width
  7301.  
  7302.  lea .oc,a0                ;set D2 = requester width
  7303.  move.l xxp_AcWind(a4),-(a7)
  7304.  move.l a5,xxp_AcWind(a4)
  7305.  bsr TLButstr              ;set: butw,buth
  7306.  move.l (a7)+,xxp_AcWind(a4)
  7307.  move.l d4,d0              ;d0 = greater of tablet box width, header width
  7308.  cmp.l d7,d0
  7309.  bcc.s .maxw
  7310.  move.l d7,d0
  7311. .maxw:
  7312.  bsr TLButfix              ;get requester width to D2, set: butx,btdx
  7313.  
  7314.  cmp.l xxp_Width(a4),d2    ;go unless too wide
  7315.  ble.s .vert
  7316.  tst.b xxp_prfp+3(a4)      ;if pref horz <> 0, retry w. pref horz - 1
  7317.  beq.s .pfx1
  7318.  subq.b #1,xxp_prfp+3(a4)
  7319.  bra .rcyc
  7320. .pfx1:
  7321.  tst.w xxp_Tspc(a5)        ;if Tspc <> 0, retry w. Tspc - 1
  7322.  beq.s .pfx2
  7323.  subq.w #1,xxp_Tspc(a5)
  7324.  bra .rcyc
  7325. .pfx2:
  7326.  tst.w xxp_Fnum(a5)        ;if Fnum <> 0, retry w. Fnum = 0
  7327.  beq.s .vert               ;(else, will be too wide)
  7328. .pfxf:
  7329.  moveq #0,d0               ;attach font 0 to dummy xxp_wsuw
  7330.  moveq #0,d1               ;(will be passed on by TLReqon)
  7331.  moveq #0,d2
  7332.  bsr TLAnyfont
  7333.  bne .rcyc
  7334.  
  7335. .vert:
  7336.  move.l d6,d3              ;set D3 = requester height...
  7337.  asl.w #1,d3
  7338.  addq.l #5,d3              ;d3=requester height before butts
  7339.  moveq #0,d5
  7340.  move.b xxp_prfp+4(a4),d5  ;d5 = pref vert
  7341.  add.l d5,d3               ;gap above buts
  7342.  move.l d3,xxp_buty(a4)    ;set buty
  7343.  clr.l xxp_btdy(a4)
  7344.  add.l xxp_buth(a4),d3
  7345.  add.l d5,d3               ;gap below buts
  7346.  tst.w d5
  7347.  beq.s .botg
  7348.  addq.l #1,d3              ;add 1 if pref vert <> 0
  7349. .botg:
  7350.  
  7351.  cmp.l xxp_Height(a4),d3   ;go if shallow enough
  7352.  ble.s .test
  7353.  tst.b xxp_prfp+4(a4)      ;if pref vert <> 0, dec pref vert & retry
  7354.  beq.s .hfx1
  7355.  subq.b #1,xxp_prfp+4(a4)
  7356.  bra .rcyc
  7357. .hfx1:
  7358.  tst.w xxp_Fnum(a5)        ;if Fnum <> 0, set Fnum = 0 & restry
  7359.  bne .pfxf                 ;(else will be too deep)
  7360.  
  7361. .test:
  7362.  bsr TLReqchek             ;fix requesters dims, &c
  7363.  beq .bad                  ;go if won't fit
  7364.  
  7365.  tst.w xxp_ReqNull(a4)     ;quit if ReqNull=0
  7366.  beq .null
  7367.  
  7368.  bsr TLReqon               ;open requester window
  7369.  beq .bad                  ;go if can't
  7370.  
  7371.  bsr TLButprt              ;draw requester buttons
  7372.  move.b xxp_prfp+2(a4),xxp_FrontPen(a5)
  7373.  move.b xxp_prfp(a4),xxp_BackPen(a5)
  7374.  lea .oc,a0
  7375.  bsr TLButtxt              ;print button text
  7376.  
  7377.  moveq #4,d0               ;print title
  7378.  moveq #2,d1
  7379.  move.l a3,xxp_IText(a5)
  7380.  move.b xxp_prfp+1(a4),xxp_FrontPen(a5)
  7381.  bsr TLText
  7382.  move.l a4,xxp_IText(a5)
  7383.  move.b xxp_prfp+2(a4),xxp_FrontPen(a5)
  7384.  
  7385.  moveq #0,d0               ;draw tablet box
  7386.  moveq #0,d1
  7387.  move.b xxp_prfp+3(a4),d1
  7388.  beq.s .nulp
  7389.  addq.l #2,d1
  7390.  add.l d1,d0
  7391. .nulp:
  7392.  sub.l d1,d2
  7393.  sub.l d1,d2
  7394.  moveq #3,d1
  7395.  add.l d6,d1
  7396.  move.l d6,d3
  7397.  addq.l #2,d3
  7398.  bsr TLReqbev
  7399.  
  7400.  subq.w #2,d3              ;D0-D3 = tablet for TLreqedit
  7401.  subq.w #8,d2
  7402.  addq.w #4,d0
  7403.  addq.w #1,d1
  7404.  
  7405.  bsr TLHook2               ;call xxp_hook2 if any
  7406.  
  7407. .wait:                     ;edit the tablet...
  7408.  bsr TLWfront
  7409.  
  7410.  moveq #0,d6               ;set d6 to task type
  7411.  tst.l xxp_WPort+8(a7)     ;initial d1: 0=str -1=num 1=hex)
  7412.  beq.s .str                ;d6=0 for str
  7413.  bmi.s .num
  7414.  moveq #3,d6               ;d6=3 for hex
  7415.  bra.s .str
  7416. .num:
  7417.  moveq #2,d6               ;d6=2 for num
  7418. .str:
  7419.  
  7420.  move.l xxp_WPort+12(a7),d7  ;d7 = initial d2 = max chrs
  7421.  
  7422.  move.l xxp_Help(a4),-(a7) ;attach default help if none
  7423.  move.l xxp_strg(a4),-(a7)
  7424.  tst.l xxp_Help(a4)
  7425.  bne.s .wtdo
  7426.  move.l #.strs,xxp_strg(a4)
  7427.  move.w #1,xxp_Help(a4)
  7428.  move.w #20,xxp_Help+2(a4)
  7429. .wtdo:
  7430.  
  7431.  sub.w #44,a7              ;room for 5 tags for TLReqedit
  7432.  move.l a7,a0
  7433.  move.l #xxp_xmaxt,(a0)+   ;tag 1: tablet width
  7434.  move.l d2,(a0)+
  7435.  move.l #xxp_xmaxc,(a0)+   ;tag 2: max chrs
  7436.  move.l d7,(a0)+
  7437.  move.l #xxp_xcrsr,(a0)+   ;tag 3: crsr (to rhs)
  7438.  move.l #$7FFF,(a0)+
  7439.  move.l #xxp_xtask,(a0)+   ;tag 4: task
  7440.  move.l d6,(a0)+
  7441.  move.l #xxp_xforb,(a0)+   ;tag 5: enable return if unrec input
  7442.  move.l #$0000BFFF,(a0)+   ;       (to collect LfAm/b, LfAm/v)
  7443.  clr.l (a0)
  7444.  move.l a7,a0
  7445.  move.l d0,-(a7)
  7446.  bsr TLReqedit             ;d0=lhs, d1=top: get user input
  7447.  move.l (a7)+,d0
  7448.  add.w #44,a7              ;remove tags
  7449.  
  7450.  move.l (a7)+,xxp_strg(a4)
  7451.  move.l (a7)+,xxp_Help(a4)
  7452.  
  7453.  move.l xxp_kybd(a4),d7    ;d7=last chr input
  7454.  cmp.w #$1B,d7             ;go if Esc
  7455.  beq.s .canc
  7456.  cmp.w #$0D,d7             ;go if return
  7457.  beq.s .good
  7458.  btst #6,xxp_kybd+15(a4)
  7459.  beq.s .wtck               ;go unless Left Amiga
  7460.  cmp.b #'b',d7
  7461.  beq.s .canc               ;LfAm / b -> Cancel
  7462.  cmp.b #'v',d7
  7463.  beq.s .good               ;LfAm / v -> OK
  7464. .wtck:
  7465.  cmp.w #$80,d7             ;recycle unless Esc/Return/lmb
  7466.  bne .wait
  7467.  
  7468.  movem.l d1-d2,-(a7)       ;lmb clicked
  7469.  move.l xxp_kybd+4(a4),d1  ;get pointer posn
  7470.  move.l xxp_kybd+8(a4),d2
  7471.  bsr TLButmon              ;calc which box (if any)
  7472.  movem.l (a7)+,d1-d2
  7473.  tst.w d0                  ;retry if neither box clicked
  7474.  beq .wait
  7475.  
  7476.  subq.l #2,d0              ;go if cancel box clicked
  7477.  beq.s .canc
  7478.  
  7479. .good:                     ;here if OK chosen
  7480.  bsr TLReqoff
  7481.  
  7482. .null:                     ;here if ReqNull=0
  7483.  moveq #-1,d0
  7484.  bra.s .done
  7485.  
  7486. .canc:                     ;here if Cancel chosen
  7487.  bsr TLReqoff
  7488.  
  7489. .bad:                      ;if cancel:  D0=0, xxp_errn=0
  7490.  moveq #0,d0               ;if bad:     D0=0, xxp_errn<>0
  7491.  
  7492. .done:
  7493.  move.w #-1,xxp_ReqNull(a4)
  7494.  bsr TLWslof
  7495.  add.w #xxp_WPort+4,a7
  7496.  move.l d0,(a7)
  7497.  movem.l (a7)+,d0-d7/a0-a6
  7498.  
  7499.  move.l (a7)+,xxp_butl(a4) ;restore button data
  7500.  move.l (a7)+,xxp_butk(a4)
  7501.  move.l (a7)+,xxp_btdy(a4)
  7502.  move.l (a7)+,xxp_btdx(a4)
  7503.  move.l (a7)+,xxp_buth(a4)
  7504.  move.l (a7)+,xxp_butw(a4)
  7505.  move.l (a7)+,xxp_buty(a4)
  7506.  move.l (a7)+,xxp_butx(a4)
  7507.  tst.l d0                  ;EQ, D0=0 if bad
  7508.  rts
  7509.  
  7510. .oc: dc.b 'OK\Cancel',0
  7511.  
  7512. .strs: dc.b 0
  7513.  dc.b 'This requester is used by you to send information to the computer.',0
  7514.  dc.b 'Simply type information into the box which contains the cursor. If',0
  7515.  dc.b 'something already appears there (called a "prompt") you can return',0
  7516.  dc.b 'it unchanged, or alter it and then return it as your input.',0
  7517.  dc.b 0
  7518.  dc.b 'When the box contains what you want it to, click "OK" (or press',0
  7519.  dc.b 'the Return key) to return it. Alternately, click "Cancel" (or',0
  7520.  dc.b 'press the Esc key) to send no message at all, and cancel.',0
  7521.  dc.b 0
  7522.  dc.b 'If you are asked for a number, you may only type characters 0-9.',0
  7523.  dc.b 'If you are asked for a hex number, you may only type 0-9 or A-F.',0
  7524.  dc.b 0
  7525.  dc.b 'Here are some special keyboard combinations:',0
  7526.  dc.b '   Shift with backspace    delete all characters before cursor',0
  7527.  dc.b '   Shift with Del          delete all characters from cursor on',0
  7528.  dc.b '   Ctrl with A             cursor to start of line',0
  7529.  dc.b '   Ctrl with Z             cursor to end of line',0
  7530.  dc.b '   Ctrl with X             delete all characters in line',0
  7531.  dc.b '   Shift with Ctrl with U  cancel effect of previous keystroke',0
  7532.  dc.b '   Shift with Ctrl with R  restore the prompt to aboriginal state',0
  7533.  ds.w 0
  7534.  
  7535.  
  7536. *>>>> make a super/subscript copy of font d0
  7537. TLSuper:
  7538.  movem.l d0-d7/a0-a6,-(a7) ;save all
  7539.  clr.l xxp_errn(a4)
  7540.  move.l xxp_FSuite(a4),a3  ;point a3 to FSuite entry d0
  7541.  mulu #xxp_fsiz,d0
  7542.  add.l d0,a3
  7543.  move.w ta_YSize(a3),d7    ;d7 = normal font height
  7544.  move.w d7,d0
  7545.  bsr TLYhalf               ;make d0 half height
  7546.  move.w d0,ta_YSize(a3)    ;set YSize to half height
  7547.  lea .libn,a1
  7548.  moveq #0,d0
  7549.  move.l xxp_sysb(a4),a6
  7550.  jsr _LVOOpenLibrary(a6)   ;open diskfont.library
  7551.  tst.l d0
  7552.  beq.s .bad1               ;bad if can't
  7553.  move.l d0,a6
  7554.  move.l a3,a0
  7555.  jsr _LVOOpenDiskFont(a6)  ;open half height font
  7556.  move.l d0,d2              ;result in d2
  7557.  move.l a6,a1
  7558.  move.l xxp_sysb(a4),a6    ;close diskfont.lbrary
  7559.  jsr _LVOCloseLibrary(a6)
  7560.  move.l d2,xxp_ital(a3)    ;put half height font to xxp_ital
  7561.  beq.s .bad2
  7562.  moveq #-1,d0
  7563.  bra.s .done
  7564. .bad1:                     ;bad 1: can't open diskfont.library (unlikely)
  7565.  moveq #8,d0
  7566.  bra.s .bad
  7567. .bad2:                     ;bad 2: can't open half-height font
  7568.  moveq #12,d0
  7569. .bad:
  7570.  move.l d0,xxp_errn(a4)    ;error code to xxp_errn
  7571.  clr.l d0
  7572. .done:
  7573.  move.w d7,ta_YSize(a3)    ;restore YSize
  7574.  tst.l d0
  7575.  movem.l (a7)+,d0-d7/a0-a6 ;EQ if bad
  7576.  rts
  7577.  
  7578. .libn: dc.b 'diskfont.library',0
  7579.  ds.w 0
  7580.  
  7581. *>>>> make YSize in D0 to be height for Super/Subscript
  7582. TLYhalf:
  7583.  lsr.w #1,d0
  7584.  cmp.w #6,d0
  7585.  bcc.s .half
  7586.  moveq #6,d0
  7587. .half:
  7588.  rts
  7589.  
  7590. *>>>> make a double width copy of font d0
  7591. TLWide:
  7592.  move.l xxp_strg(a4),-(a7) ;attach local strings
  7593.  clr.l xxp_errn(a4)
  7594.  move.l #.str,xxp_strg(a4)
  7595.  movem.l d0-d7/a0-a6,-(a7) ;save all
  7596.  
  7597.  subq.l #8,a7              ;lock on FONTS:Temporary, FONTS: here
  7598.  clr.l (a7)                ;(512(a7) will hold lock on FONTS:Temporary)
  7599.  clr.l 4(a7)               ;(516(a7) will hold lock on FONTS:)
  7600.  sub.w #512,a7             ;* table for CharData translation
  7601.  
  7602.  move.l xxp_FSuite(a4),a0  ;* a5 = single width font
  7603.  mulu #xxp_fsiz,d0
  7604.  move.l xxp_plain(a0,d0.l),a5
  7605.  
  7606.  move.l a7,a1              ;a1 puts to table
  7607.  moveq #0,d4               ;d4 values 0-255
  7608.  move.w #255,d2            ;d2 counts table entries
  7609. .tabl:
  7610.  move.b d4,d0              ;d0 gets input bytes
  7611.  moveq #0,d1               ;d1 puts output bytes
  7612.  moveq #7,d3               ;d3 counts bits
  7613. .bits:                     ;for all set bits...
  7614.  lsr.b #1,d0               ;get next input bit
  7615.  bcc.s .bit0
  7616.  or.w #3,d1                ;set rightmost 2 if rightmost 1 set
  7617. .bit0:
  7618.  ror.w #2,d1               ;shift around (1st 2 end up at 0,1)
  7619.  dbra d3,.bits             ;until all bits shifted out -> in
  7620.  move.w d1,(a1)+           ;put output word
  7621.  addq.b #1,d4              ;bump input byte value
  7622.  dbra d2,.tabl             ;until table complete
  7623.  
  7624.  bsr .dell                 ;* delete existing Temorary.font if any
  7625.  
  7626.  moveq #2,d0               ;* create new FONTS:Temporary dir
  7627.  bsr TLStrbuf
  7628.  move.l a4,d1
  7629.  move.l xxp_dosb(a4),a6
  7630.  jsr _LVOCreateDir(a6)
  7631.  move.l d0,512(a7)         ;save lock
  7632.  beq .bad1                 ;bad if can't (unlikely)
  7633.  
  7634.  move.l a4,a0              ;* open output file
  7635.  add.w #13,a0
  7636.  move.b #'/',(a0)+         ;append /[YSize] to dirname
  7637.  moveq #0,d0
  7638.  move.w tf_YSize(a5),d0
  7639.  bsr TLHexasc
  7640.  clr.b (a0)
  7641.  bsr TLOpenwrite           ;open it for writing
  7642.  beq .bad2                 ;bad if can't
  7643.  
  7644.  lea .frnt,a0              ;* copy .frnt & c. to buff
  7645.  move.l a4,a1
  7646.  move.w #.back-.frnt-1,d1
  7647. .tfr1:
  7648.  move.b (a0)+,(a1)+
  7649.  dbra d1,.tfr1
  7650.  
  7651.  move.l a4,a0
  7652.  add.w #.fnth-.frnt+$0023,a0
  7653.  moveq #0,d0
  7654.  move.w tf_YSize(a5),d0
  7655.  bsr TLHexasc              ;append [YSize] to filename in .fnth
  7656.  
  7657.  move.l a4,a3
  7658.  add.w #.font-.frnt-tf_YSize,a3   ;a3= font structure in output
  7659.  move.l tf_YSize(a5),tf_YSize(a3) ;copy YSize,Style,Flags
  7660.  move.b #FPF_DESIGNED!FPF_DISKFONT,tf_Flags(a3)
  7661.  tst.l tf_CharSpace(a5)
  7662.  beq.s .flgs
  7663.  or.b #FPF_PROPORTIONAL,tf_Flags(a3)
  7664. .flgs:
  7665.  move.w tf_XSize(a5),d0
  7666.  asl.w #1,d0
  7667.  move.w d0,tf_XSize(a3)                 ;copy & double XSize
  7668.  move.l tf_Baseline(a5),tf_Baseline(a3) ;copy Baseline,BoldSmear
  7669.  clr.w tf_Accessors(a3)                 ;Accessors = 0
  7670.  move.w tf_LoChar(a5),tf_LoChar(a3)     ;LoChar,HiChar
  7671.  move.w tf_Modulo(a5),d0
  7672.  asl.w #1,d0
  7673.  move.w d0,tf_Modulo(a3)                ;copy & double Modulo
  7674.  moveq #0,d7
  7675.  move.b tf_HiChar(a5),d7   ;d7 = no. of glyphs
  7676.  sub.b tf_LoChar(a5),d7
  7677.  addq.w #1,d7
  7678.  move.l #.back1-.fnth,d0   ;d0 = rel addr where CharData will be
  7679.  move.l d0,tf_CharData(a3) ;put CharData relative address
  7680.  move.w tf_Modulo(a3),d1
  7681.  mulu tf_YSize(a3),d1      ;CharData size = Modulo * YSize
  7682.  add.l d1,d0
  7683.  move.l d0,tf_CharLoc(a3)  ;put CharLoc relative address
  7684.  move.l d7,d1
  7685.  lsl.l #2,d1               ;CharLoc size = Glyphs * 4
  7686.  add.l d1,d0
  7687.  lsr.l #1,d1
  7688.  btst #1,d1                ;d1 = Glyphs * 2, rounded up to even longwords
  7689.  beq.s .cry1
  7690.  addq.l #2,d1
  7691. .cry1:
  7692.  clr.l tf_CharSpace(a3)    ;if input CharSpace = 0, so does output
  7693.  tst.l tf_CharSpace(a5)
  7694.  beq.s .krns
  7695.  move.l d0,tf_CharSpace(a3)   ;put rel addr to CharSpace
  7696.  add.l d1,d0                  ;add Glyphs * 2 to output size
  7697. .krns:
  7698.  clr.l tf_CharKern(a3)     ;if input CharKern = 0, so does output
  7699.  tst.l tf_CharKern(a5)
  7700.  beq.s .krnf
  7701.  move.l d0,tf_CharKern(a3)    ;put rel addr to CharSpace
  7702.  add.l d1,d0                  ;add glyphs * 2 to output size
  7703. .krnf:
  7704.  lsr.l #2,d0               ;d0 = longwords from .fnth
  7705.  move.l d0,$0014(a4)       ;poke hunk size
  7706.  move.l d0,$001C(a4)
  7707.  
  7708.  move.l a4,d2              ;save from .frnt to .back1
  7709.  move.l #.back1-.frnt,d3
  7710.  bsr TLWritefile
  7711.  beq .bad3                 ;bad if can't
  7712.  bsr .buff                 ;set up outfile buffer
  7713.  
  7714.  move.w tf_Modulo(a5),d6   ;* send CharData
  7715.  mulu tf_YSize(a3),d6      ;d6 = bytes in old CharData
  7716.  move.l tf_CharData(a5),a0 ;a0 gets from old CharData
  7717. .cdat:
  7718.  moveq #0,d1
  7719.  move.b (a0)+,d1           ;get next byte of CharData
  7720.  lsl.w #1,d1               ;find  posn in lookup table in stack
  7721.  move.w 0(a7,d1.w),d0      ;send to outfile (1 byte -> 1 word)
  7722.  bsr .file
  7723.  beq .bad3                 ;bad if can't
  7724.  subq.l #1,d6              ;until all new CharData sent
  7725.  bne .cdat
  7726.  bsr .flsh                 ;flush unsent bytes from buff
  7727.  beq .bad3                 ;bad if can't
  7728.  
  7729.  move.l d7,d6              ;* send CharLoc
  7730.  subq.w #1,d6              ;d6 counts
  7731.  move.l tf_CharLoc(a5),a0  ;a0 sends old CharLoc
  7732. .cloc:
  7733.  move.l (a0)+,d0           ;get next old
  7734.  swap d0                   ;get msw
  7735.  asl.w #1,d0                 ;double it
  7736.  bsr .file                 ;send it
  7737.  beq .bad3                 ;bad if can't
  7738.  swap d0                   ;get lsw
  7739.  asl.w #1,d0               ;double it
  7740.  bsr .file                 ;send it
  7741.  beq .bad3                 ;bad if can't
  7742.  dbra d6,.cloc
  7743.  bsr .flsh                 ;flush unsent bytes
  7744.  beq .bad3
  7745.  
  7746.  move.l tf_CharSpace(a5),d0 ;* send CharSpace
  7747.  beq.s .clkr               ;go if none
  7748.  move.l d0,a0              ;a0 sends old CharSpace
  7749.  move.l d7,d6              ;d6 counts
  7750.  subq.w #1,d6
  7751. .clcs:
  7752.  move.w (a0)+,d0           ;get next old
  7753.  asl.w #1,d0               ;double it
  7754.  bsr .file                 ;send it
  7755.  beq .bad3                 ;bad if can't
  7756.  dbra d6,.clcs
  7757.  bsr .flsh                 ;flush unsent bytes, longword fill
  7758.  beq .bad3
  7759.  
  7760. .clkr:                     ;* send CharKern
  7761.  move.l tf_CharKern(a5),d0
  7762.  beq.s .clkd               ;go if none
  7763.  move.l d0,a0              ;a0 sends old CharKern
  7764.  move.l d7,d6              ;d6 counts
  7765.  subq.w #1,d6
  7766. .clkn:
  7767.  move.w (a0)+,d0           ;get next old
  7768.  asl.w #1,d0               ;double it
  7769.  bsr .file                 ;send it
  7770.  beq .bad3                 ;bad if can't
  7771.  dbra d6,.clkn
  7772.  bsr .flsh                 ;flush unsent bytes, longword fill
  7773.  beq .bad3
  7774.  
  7775. .clkd:                     ;* send .back1, .back2
  7776.  lea .back1,a0             ;send 1st long of .back1
  7777.  move.l a4,a1
  7778.  move.l (a0)+,(a1)+
  7779.  addq.l #4,a0
  7780.  move.l #4,(a1)+           ;send 4 pro-tem = reloc count
  7781.  moveq #4,d0
  7782. .bax:
  7783.  move.l (a0)+,(a1)+        ;send hunk num & 4 relocs
  7784.  dbra d0,.bax
  7785.  tst.l tf_CharSpace(a5)    ;go if no CharSpace
  7786.  beq.s .bxc1
  7787.  move.l (a0),(a1)+         ;else send CharSpace reloc
  7788.  addq.l #1,4(a4)           ;& bump reloc count
  7789. .bxc1:
  7790.  tst.l tf_CharKern(a5)     ;go if no CharKern
  7791.  beq.s .bxc2
  7792.  move.l 4(a0),(a1)+        ;else send CharKern reloc
  7793.  addq.l #1,4(a4)           ;& bump reloc count
  7794. .bxc2:
  7795.  addq.l #8,a0
  7796.  move.l (a0)+,(a1)+        ;send relocs delim & hunk_end
  7797.  move.l (a0)+,(a1)+
  7798.  move.l a4,d2
  7799.  move.l a1,d3
  7800.  sub.l d2,d3
  7801.  bsr TLWritefile           ;write .back1 - .back
  7802.  beq .bad3                 ;bad if can't
  7803.  
  7804.  bsr TLClosefile           ;* close file - created ok
  7805.  
  7806.  move.l xxp_dosb(a4),a6    ;* unlock Temporary
  7807.  move.l 512(a7),d1
  7808.  jsr _LVOUnLock(a6)
  7809.  clr.l 512(a7)
  7810.  
  7811.  moveq #5,d0               ;* lock FONTS:
  7812.  bsr TLStrbuf
  7813.  move.l a4,d1
  7814.  moveq #ACCESS_READ,d2
  7815.  jsr _LVOLock(a6)
  7816.  move.l d0,516(a7)
  7817.  beq .bad7
  7818.  
  7819.  moveq #3,d0               ;* open diskfont.library
  7820.  bsr TLStrbuf
  7821.  move.l xxp_sysb(a4),a6
  7822.  move.l a4,a1
  7823.  moveq #34,d0
  7824.  jsr _LVOOpenLibrary(a6)
  7825.  tst.l d0
  7826.  beq .bad4                 ;bad if can't (unlikely)
  7827.  move.l d0,a6
  7828.  
  7829.  moveq #4,d0               ;* create Temporary.font file
  7830.  bsr TLStrbuf
  7831.  move.l 516(a7),a0
  7832.  move.l a4,a1
  7833.  jsr _LVONewFontContents(a6)
  7834.  move.l d0,d2              ;d2 = fontContentsHeader
  7835.  beq .bad5                 ;bad if NewFontContents failed
  7836.  moveq #7,d0
  7837.  bsr TLStrbuf
  7838.  bsr TLOpenwrite           ;open Temporary.font
  7839.  beq .bad8                 ;bad if can't
  7840.  move.l d2,a0
  7841.  move.w fch_NumEntries(a0),d3
  7842.  mulu #tfc_SIZEOF,d3
  7843.  addq.l #fch_FC,d3
  7844.  bsr TLWritefile           ;write NewFontContents
  7845.  beq .bad9                 ;bad if can't
  7846.  bsr TLClosefile           ;close Temporary.font
  7847.  move.l d2,a1
  7848.  jsr _LVODisposeFontContents(a6)
  7849.  
  7850.  moveq #7,d0               ;* load Temporary/[YSize]
  7851.  bsr TLStrbuf
  7852.  move.l a4,a0              ;make textattr at buff+20
  7853.  add.w #20,a0
  7854.  move.l a4,ta_Name(a0)
  7855.  move.w tf_YSize(a5),ta_YSize(a0)
  7856.  clr.w ta_Style(a0)
  7857.  jsr _LVOOpenDiskFont(a6)
  7858.  move.l d0,d7              ;d7 = result of OpenDiskFont (full height)
  7859.  move.l a4,a0
  7860.  add.w #20,a0
  7861.  move.w ta_YSize(a0),d0
  7862.  bsr TLYhalf               ;make d0 half hright
  7863.  move.w d0,ta_YSize(a0)
  7864.  jsr _LVOOpenDiskFont(a6)
  7865.  move.l d0,d6              ;d6 = result of OpenDiskFont (half height)
  7866.  
  7867.  move.l a6,a1              ;* close diskfont.library
  7868.  move.l xxp_sysb(a4),a6
  7869.  jsr _LVOCloseLibrary(a6)
  7870.  
  7871.  move.l xxp_FSuite(a4),a0  ;* put font in FSuite
  7872.  move.l 520(a7),d1
  7873.  mulu #xxp_fsiz,d1
  7874.  move.l d7,xxp_bold(a0,d1.l)
  7875.  beq .bad10                ;bad if OpenDiskFont failed
  7876.  move.l d6,xxp_boit(a0,d1.l)
  7877.  moveq #-1,d0              ;else, report success
  7878.  bra.s .done
  7879.  
  7880. .bad1:                     ;* can't create FONTS:Temporary
  7881.  moveq #13,d0
  7882.  bra.s .bad
  7883.  
  7884. .bad2:                     ;* can't open FONTS:Temporary/[YSize]
  7885.  moveq #14,d0
  7886.  bra.s .bad
  7887.  
  7888. .bad3:                     ;* can't write to FONTS:Temporary/[YSize]
  7889.  moveq #15,d0
  7890.  bra.s .bad
  7891.  
  7892. .bad4:                     ;* can't open diskfont.library (v. 34+)
  7893.  moveq #8,d0
  7894.  bra.s .bad
  7895.  
  7896. .bad5:                     ;* new font contents failed
  7897.  move.l a6,a1
  7898.  move.l xxp_sysb(a4),a6
  7899.  jsr _LVOCloseLibrary(a6)
  7900.  moveq #16,d0
  7901.  bra.s .bad
  7902.  
  7903. .bad6:                     ;* can't open doubled font (out of public ram?)
  7904.  moveq #1,d0
  7905.  bra.s .bad
  7906.  
  7907. .bad7:                     ;* can't lock FONTS: (unlikely)
  7908.  moveq #17,d0
  7909.  bra.s .bad
  7910.  
  7911. .bad8:                     ;* can't open Temporary.font for writing
  7912.  move.l d2,a1
  7913.  jsr _LVODisposeFontContents(a6)
  7914.  move.l a6,a1
  7915.  move.l xxp_sysb(a4),a6
  7916.  jsr _LVOCloseLibrary(a6)
  7917.  moveq #18,d0
  7918.  bra.s .bad
  7919.  
  7920. .bad9:                     ;* can't write to Temporary.font
  7921.  move.l d2,a1
  7922.  jsr _LVODisposeFontContents(a6)
  7923.  move.l a6,a1
  7924.  move.l xxp_sysb(a4),a6
  7925.  jsr _LVOCloseLibrary(a6)
  7926.  moveq #19,d0
  7927.  bra.s .bad
  7928.  
  7929. .bad10:                    ;* can't open Temporary/[YSize] as created
  7930.  moveq #20,d0
  7931.  
  7932. .bad:
  7933.  move.l d0,xxp_errn(a4)
  7934.  moveq #0,d0
  7935.  
  7936. .done:                     ;* close down
  7937.  bsr.s .kill               ;remove locks, if any
  7938.  bsr.w .dell               ;remove Temorary.font, if any
  7939.  add.w #512,a7
  7940.  add.l #8,a7
  7941.  tst.l d0                  ;NE=good  EQ=bad
  7942.  movem.l (a7)+,d0-d7/a0-a6
  7943.  move.l (a7)+,xxp_strg(a4)
  7944.  rts
  7945.  
  7946. .kill:                     ;** remove locks, if they exist
  7947.  movem.l d0-d3/a0-a1/a6,-(a7) ;save all (add 28 to stack, +rts = 32)
  7948.  move.l xxp_dosb(a4),a6
  7949.  move.l 512+32(a7),d1      ;if locked, unlock FONTS:Temorary
  7950.  beq.s .klu1
  7951.  jsr _LVOUnLock(a6)
  7952.  clr.l 512+32(a7)
  7953. .klu1:
  7954.  move.l 516+32(a7),d1      ;if locked, unlock FONTS:
  7955.  beq.s .klu2
  7956.  jsr _LVOUnLock(a6)
  7957.  clr.l 516+32(a7)
  7958. .klu2:
  7959.  movem.l (a7)+,d0-d3/a0-a1/a6
  7960.  rts
  7961.  
  7962. .dell:                     ;** delete Temporary.font
  7963.  movem.l d0-d3/a0-a1/a6,-(a7)
  7964.  move.l xxp_dosb(a4),a6
  7965.  moveq #1,d0               ;* delete existing FONTS:Temporary (if any)
  7966.  bsr.s .kldo
  7967.  moveq #6,d0               ;* delete existing FONT:Temporary.font (if any)
  7968.  bsr.s .kldo
  7969.  movem.l (a7)+,d0-d3/a0-a1/a6
  7970.  rts
  7971.  
  7972. .kldo:                     ;** execute dos command in string D0
  7973.  bsr TLStrbuf
  7974.  move.l a4,d1
  7975.  moveq #0,d2
  7976.  moveq #0,d3
  7977.  jsr _LVOExecute(a6)
  7978.  rts
  7979.  
  7980. .buff:                     ;** set up buff as outfile buffer
  7981.  move.l a4,128(a4)         ;buff+128 = pointer
  7982.  rts
  7983.  
  7984. .file:                     ;** send a word to the outfile buffer
  7985.  movem.l d0-d3/a0,-(a7)    ;save all
  7986.  move.l 128(a4),a0
  7987.  move.w d0,(a0)+           ;send word to buff
  7988.  move.l a0,128(a4)
  7989.  sub.w #128,a0             ;buff full?
  7990.  cmp.l a4,a0
  7991.  bcs.s .filg               ;no, go
  7992.  move.l a4,d2
  7993.  move.l #128,d3
  7994.  bsr TLWritefile           ;yes, send to file
  7995.  beq.s .fild               ;bad if can't
  7996.  move.l a4,128(a4)         ;restart pointer
  7997. .filg:
  7998.  moveq #-1,d0              ;NE = good
  7999. .fild:                     ;EQ = bad
  8000.  movem.l (a7)+,a0/d0-d3
  8001.  rts
  8002.  
  8003. .flsh:                     ;** longword align & flush the outfiel buffer
  8004.  movem.l d0-d3/a0,-(a7)    ;save all
  8005.  move.l 128(a4),a0         ;a0 = pointer so far
  8006. .flal:
  8007.  move.l a0,d3              ;get length to save
  8008.  clr.w (a0)+               ;(clr fwd in case aligning)
  8009.  sub.l a4,d3               ;d3 = len to save
  8010.  beq.s .flgd               ;go if nil
  8011.  move.l d3,d2
  8012.  and.l #3,d2               ;lonword aligned?
  8013.  bne .flal                 ;no, send a(nother) null
  8014.  move.l a4,d2
  8015.  bsr TLWritefile           ;send buff contents
  8016.  beq.s .flbd               ;bad if can't
  8017.  move.l a4,128(a4)         ;restart pointer
  8018. .flgd:
  8019.  moveq #-1,d0              ;NE = good
  8020.  bra.s .fldn
  8021. .flbd:
  8022.  moveq #0,d0               ;EQ = bad
  8023. .fldn:
  8024.  movem.l (a7)+,a0/d0-d3
  8025.  rts
  8026.  
  8027. .str: dc.b 0
  8028.  dc.b 'DELETE RAM:Temporary ALL >NIL:',0 ;1
  8029.  dc.b 'RAM:Temporary',0 ;2
  8030.  dc.b 'diskfont.library',0 ;3
  8031.  dc.b 'Temporary.font',0 ;4
  8032.  dc.b 'RAM:',0 ;5
  8033.  dc.b 'DELETE RAM:Temporary.font >NIL:',0 ;6
  8034.  dc.b 'RAM:Temporary.font',0 ;7
  8035.  ds.w 0
  8036.  
  8037. .frnt:                     ;* front end of file
  8038.  dc.l $000003F3            ;$0000 hunk_header
  8039.  dc.l $00000000            ;$0004 name delim
  8040.  dc.l $00000001            ;$0008 table size
  8041.  dc.l $00000000            ;$000C F
  8042.  dc.l $00000000            ;$0010 L
  8043.  ds.l 1                    ;$0014 *** poke longwords in .fnth -> .back here
  8044.  dc.l $000003E9            ;$0018 hunk_code
  8045.  ds.l 1                    ;$001C *** poke longwords in .fnth -> .back here
  8046. .fnth:
  8047.  dc.w $70FF                ;$0000 MOVEQ #-1,D0
  8048.  dc.w $4E75                ;$0002 RTS
  8049.  dc.l 0                    ;$0004 LN_Succ                  }  LN_SIZE
  8050.  dc.l 0                    ;$0008 LN_Pred                  }
  8051.  dc.b NT_FONT              ;$000C LN_Type                  }
  8052.  dc.b 0                    ;$000D LN_Pri                   }
  8053.  dc.l $0000001A            ;$000E rel address of font name }
  8054.  dc.w DFH_ID               ;$0012 FileID
  8055.  dc.w 1                    ;$0014 Revision
  8056.  dc.l 0                    ;$0016 Segment
  8057.  dc.b 'Temporary'          ;$001A font name
  8058.  dc.b 0,0,0,0,0,0,0        ;$0023 poke length in ASCII here
  8059.  dc.l 0,0,0,0              ;$002A fill to MAXFONTNAME
  8060.  dc.l 0                    ;$003A LN_Succ
  8061.  dc.l 0                    ;$003E LN_Pred
  8062.  dc.b NT_FONT              ;$0042 LN_Type
  8063.  dc.b 0                    ;$0043 LN_Pri
  8064.  dc.l $0000001A            ;$0044 rel address of font name (-42)
  8065.  dc.l 0                    ;$0048 MN_ReplyPort
  8066.  dc.w 0                    ;$004C OS1.4
  8067. .font:
  8068.  ds.w 1                    ;$004E tf_YSize    *** poke YSize here
  8069.  ds.b 1                    ;$0050 tf_Style
  8070.  ds.b 1                    ;$0051 tf_Flags
  8071.  ds.w 1                    ;$0052 tf_XSize
  8072.  ds.w 1                    ;$0054 tf_Baseline
  8073.  dc.w 1                    ;$0056 tf_BoldSmear
  8074.  ds.w 1                    ;$0058 tf_Accessors
  8075.  ds.b 1                    ;$005A tf_LoChar
  8076.  ds.b 1                    ;$005B tf_HiChar
  8077.  ds.l 1                    ;$005C tf_CharData  *** rel addr here
  8078.  ds.w 1                    ;$0060 tf_Modulo
  8079.  ds.l 1                    ;$0062 tf_FontLoc   *** rel addr here
  8080.  ds.l 1                    ;$0066 tf_CharSpace *** rel addr / 0 here
  8081.  ds.l 1                    ;$006A tf_CharKern  *** rel addr / 0 here
  8082.  dc.w 0                    ;$006E longword fill
  8083.  
  8084. ;then follow:
  8085. ;  CharData       tf_Modulo * tf_YSize
  8086. ;  CharLoc        1 longword / chr
  8087. ;  CharSpace      1 word / chr
  8088. ;  Charkern       1 word / chr
  8089.  
  8090. .back1:                    ;$0000 append after font
  8091.  dc.l $000003EC            ;$0004 hunk_reloc
  8092.  ds.l 1                    ;$0008 relocs       *** poke 4-6 here
  8093.  dc.l $00000000            ;$000C hunk number
  8094.  dc.l $0000000E            ;$0010 font name
  8095.  dc.l $00000044            ;$0014 font name
  8096.  dc.l $0000005C            ;$0018 font data
  8097.  dc.l $00000062            ;$001C font loc
  8098.  dc.l $00000066            ;$0020 }            *** optional,
  8099.  dc.l $0000006A            ;$0024 }                tf_CharSpace/Kern if<>0
  8100.  
  8101. .back2:
  8102.  dc.l $00000000            ;$0000 no more reloc hunk
  8103.  dc.l $000003F2            ;$0004 hunk_end
  8104. .back:
  8105.  
  8106.  
  8107. *>>>> select a font from FSuite, & change FSuite items if appropriate
  8108.  
  8109. ;D0 = forbids:  bit 0-9 to forbid load/close of font 0-9
  8110. ;returns D0 = 1-10 if font chosen, D0=0 if cancel
  8111. ;        EQ, errn<> if bad
  8112.  
  8113. TLReqfont:
  8114.  move.l xxp_strg(a4),-(a7) ;save global strings
  8115.  move.l #.str,xxp_strg(a4)
  8116.  move.l xxp_Help(a4),-(a7) ;install local help
  8117.  move.w #5,xxp_Help(a4)
  8118.  move.w #18,xxp_Help+2(a4)
  8119.  movem.l d0-d7/a0-a6,-(a7) ;save all except result in D0
  8120.  clr.l xxp_errn(a4)
  8121.  moveq #0,d7               ;d7 = return code (0 in case bad/cancel)
  8122.  moveq #0,d6               ;d6 top half = currently viewing
  8123.  move.w d0,d6              ;d6 bot half = forbids
  8124.  sub.w #xxp_WPort+4,a7     ;room for dummy part xxp_Wsuw
  8125.  
  8126.  move.l a7,a5              ;a5 points to dummy IntuiText
  8127.  bsr TLReqredi             ;set pop window
  8128.  beq .done                 ;bad if can't - unlikely
  8129.  
  8130.  move.l xxp_pref(a4),a0    ;get prefs data
  8131.  move.l xxp_ychs(a0),xxp_prfp(a4)
  8132.  move.l xxp_ychs+4(a0),xxp_prfp+4(a4)
  8133.  
  8134.  move.l #640,d2            ;check requester size & posn
  8135.  move.l #142,d3
  8136.  bsr TLReqchek
  8137.  beq .done                 ;bad if can't - unlikely
  8138.  
  8139.  bsr TLReqon               ;window on
  8140.  beq .done                 ;bad if can't
  8141.  
  8142. .rcyc:                     ;redraw all
  8143.  
  8144.  moveq #2,d0
  8145.  bset #29,d0
  8146.  moveq #1,d1
  8147.  move.l #636,d2
  8148.  move.l #140,d3
  8149.  moveq #0,d4
  8150.  move.b xxp_prfp(a4),d4    ;background colour from xxp_prfp
  8151.  bsr TLReqarea
  8152.  
  8153.  move.b xxp_prfp+1(a4),xxp_FrontPen(a5)
  8154.  move.b xxp_prfp(a4),xxp_BackPen(a5)
  8155.  moveq #1,d0               ;print hail
  8156.  bsr TLStrbuf
  8157.  moveq #4,d0
  8158.  moveq #1,d1
  8159.  bsr TLTrim
  8160.  
  8161.  moveq #3,d0               ;fnum currently showing
  8162.  bsr TLStrbuf
  8163.  swap d6
  8164.  move.b d6,5(a4)
  8165.  add.b #'0',5(a4)
  8166.  swap d6
  8167.  move.l #132,d0
  8168.  moveq #120,d1
  8169.  bsr TLTrim
  8170.  
  8171.  move.b xxp_prfp+2(a4),xxp_FrontPen(a5)
  8172.  moveq #2,d0
  8173.  bsr TLStrbuf              ;str for fonts table
  8174.  move.l xxp_FSuite(a4),a0  ;a0 scans FSuite
  8175.  moveq #10,d1              ;d1 = ypos
  8176.  moveq #10,d3              ;d3 = box height
  8177.  moveq #9,d4               ;d4 counts fonts
  8178.  move.l d6,d5              ;d5 = forbids
  8179. .fnum:
  8180.  addq.w #1,d1
  8181.  moveq #4,d0               ;text
  8182.  bsr TLTrim
  8183.  subq.w #1,d1
  8184.  moveq #16,d0              ;choose box
  8185.  tst.l (a0)
  8186.  bne.s .fnul
  8187.  bset #31,d0               ;can't choose if font null
  8188. .fnul:
  8189.  moveq #56,d2
  8190.  bsr TLReqbev
  8191.  add.w d2,d0               ;view box
  8192.  bsr TLReqbev
  8193.  bclr #31,d0
  8194.  add.w d2,d0               ;fname box
  8195.  move.w #264,d2
  8196.  cmp.w #9,d4
  8197.  beq.s .fnrc               ;can never change font 0
  8198.  ror.w #1,d5
  8199.  bcc.s .fnmb               ;recess if load/reload this font forbidden
  8200. .fnrc:
  8201.  bset #31,d0
  8202. .fnmb:
  8203.  bsr TLReqbev
  8204.  addq.b #1,(a4)            ;bump fnum
  8205.  add.w #10,d1              ;bump ypos
  8206.  add.w #xxp_fsiz,a0        ;to next font
  8207.  dbra d4,.fnum             ;until all done
  8208.  
  8209.  move.l xxp_FSuite(a4),a2  ;print fnames...
  8210.  moveq #11,d1              ;d1 = ypos
  8211.  moveq #9,d2               ;d2 counts
  8212. .fnam:
  8213.  tst.l (a2)                ;go if font null
  8214.  beq.s .fnxn
  8215.  move.l a2,a1              ;name to buff
  8216.  addq.l #8,a1
  8217.  move.l a4,a0
  8218. .fntf:
  8219.  move.b (a1)+,(a0)+
  8220.  bne .fntf
  8221.  clr.b 32(a4)
  8222.  move.l #132,d0            ;print fname
  8223.  bsr TLTrim
  8224.  
  8225.  moveq #0,d0               ;print fsiz
  8226.  move.w 4(a2),d0
  8227.  move.l a4,a0
  8228.  move.b #32,(a0)+
  8229.  bsr TLHexasc
  8230.  clr.b (a0)
  8231.  clr.b 4(a4)
  8232.  move.l #356,d0
  8233.  bsr TLTrim
  8234.  
  8235. .fnxn:
  8236.  add.w #10,d1              ;bump ypos
  8237.  add.w #xxp_fsiz,a2        ;to next font
  8238.  dbra d2,.fnam             ;until all printed
  8239.  
  8240.  move.l #400,d0            ;box around show area
  8241.  bset #31,d0
  8242.  move.l #232,d2
  8243.  moveq #10,d1
  8244.  move.l #128,d3
  8245.  bsr TLReqbev
  8246.  
  8247.  moveq #0,d0               ;show sample text
  8248.  swap d6
  8249.  move.w d6,d0              ;get fnum
  8250.  swap d6
  8251.  moveq #0,d1
  8252.  moveq #0,d2
  8253.  bsr TLNewfont             ;set the font
  8254.  bne.s .shwr               ;go if ok
  8255. .zap:
  8256.  swap d6
  8257.  clr.w d6                  ;else zap it & recyc
  8258.  swap d6
  8259.  bra .rcyc
  8260. .shwr:
  8261.  moveq #4,d0               ;tfr sample text to buff
  8262.  bsr TLStrbuf
  8263. .wdth:
  8264.  movem.l d6-d7,-(a7)       ;get its width
  8265.  bsr TLTsize
  8266.  movem.l (a7)+,d6-d7
  8267.  cmp.w #229,d4             ;does it fit?
  8268.  bcs.s .wdok               ;yes, go
  8269.  move.l a4,a0
  8270. .chop:
  8271.  tst.b (a0)+               ;no, truncate it
  8272.  bne .chop
  8273.  subq.l #1,a0
  8274.  cmp.l a4,a0               ;no chrs fit? (unlikely)
  8275.  beq .zap                  ;yes, go zap
  8276.  clr.b -1(a0)              ;else, truncate, see if fits now
  8277.  bra .wdth
  8278. .wdok:
  8279.  move.l #402,d0            ;print the sample (as possible truncated)
  8280.  moveq #11,d1
  8281.  bsr TLTrim
  8282.  
  8283.  moveq #0,d0               ;restore to font 0
  8284.  moveq #0,d1
  8285.  moveq #0,d2
  8286.  bsr TLNewfont
  8287.  
  8288. .wait:                     ;wait for response
  8289.  bsr TLWfront
  8290.  bsr TLKeyboard
  8291.  
  8292.  cmp.b #$1B,d0             ;cancelled if Esc
  8293.  beq .good
  8294.  
  8295.  cmp.b #$80,d0             ;else accept only lmb
  8296.  bne .wait
  8297.  sub.w #10,d2              ;set d2 = fnum (0-9)
  8298.  bcs .wait
  8299.  divu #10,d2
  8300.  cmp.w #10,d2
  8301.  bcc .wait
  8302.  sub.w #16,d1
  8303.  bcs .wait
  8304.  sub.w #56,d1              ;go if choose
  8305.  bcs .chos
  8306.  sub.w #56,d1              ;go if view
  8307.  bcs .view
  8308.  sub.w #265,d1             ;go unless fname
  8309.  bcc .wait
  8310.  
  8311.  btst d2,d6                ;fname (load/reload) chosen - go if forbidden
  8312.  bne.s .errr
  8313.  moveq #0,d0               ;fnum to d0
  8314.  move.w d2,d0
  8315.  beq.s .errr               ;bad if 0 (always forbidden)
  8316.  bsr TLAslfont             ;get new font
  8317.  beq.s .errr               ;go if bad/forbidden
  8318.  
  8319. .view:                     ;view a font
  8320.  move.l xxp_FSuite(a4),a0
  8321.  move.w d2,d0
  8322.  mulu #xxp_fsiz,d0         ;go if that font null
  8323.  tst.l 0(a0,d0.l)
  8324.  beq.s .errr
  8325.  swap d6
  8326.  move.w d2,d6              ;set view to loaded/clicked font
  8327.  swap d6
  8328.  bra .rcyc
  8329.  
  8330. .chos:                     ;font chosen...
  8331.  move.l xxp_FSuite(a4),a0
  8332.  move.w d2,d0
  8333.  mulu #xxp_fsiz,d0         ;go if that font null
  8334.  tst.l 0(a0,d0.l)
  8335.  beq.s .errr
  8336.  move.w d2,d7
  8337.  addq.l #1,d7              ;else that fnum+1 to d7 (= value returned)
  8338.  bra.s .good
  8339.  
  8340. .errr:
  8341.  movem.l d0-d1/a0-a1/a6,-(a7) ;if error, beep & recycle
  8342.  move.l xxp_intb(a4),a6
  8343.  move.l xxp_Screen(a4),a0
  8344.  jsr _LVODisplayBeep(a6)
  8345.  movem.l (a7)+,d0-d1/a0-a1/a6
  8346.  bra .rcyc
  8347.  
  8348. .good:
  8349.  bsr TLReqoff              ;close requester window, pop old window if any
  8350.  
  8351. .done:
  8352.  bsr TLWslof               ;clear all message buffers
  8353.  add.w #xxp_WPort+4,a7     ;remove dummy IntuiText
  8354.  move.l d7,(a7)            ;return code to stack d0
  8355.  
  8356.  movem.l (a7)+,d0-d7/a0-a6 ;D0=0 if bad/cancel, else 1+=choice
  8357.  move.l (a7)+,xxp_Help(a4)
  8358.  move.l (a7)+,xxp_strg(a4)
  8359.  rts
  8360.  
  8361. .str: dc.b 0
  8362.  dc.b 'Choose (&/or load) a font...       (Press <Help> for assistance)',0
  8363.  dc.b '0 Choose  View',0 ;2
  8364.  dc.b 'Font . currently viewing',0 ;3
  8365.  dc.b 'AaBbCc012;,!',0 ;4
  8366.  dc.b 'You are required to select a font...',0 ;5
  8367.  dc.b 'If you do not wish to select a font, press the <esc> key.',0 ;6
  8368.  dc.b 'The requester has at its left a list of fonts, numbered 0 to 9.',0 ;7
  8369.  dc.b 'Then, there are "Choose" & "View" buttons, followed by a button',0 ;8
  8370.  dc.b 'with the font name and height (if any) on it. If that button is',0 ;9
  8371.  dc.b 'blank, it does not currently exist, and you cannot currently',0 ;10
  8372.  dc.b 'choose it. You may click the font name and height button, to load',0
  8373.  dc.b 'another font. When you do, an ASL font selector comes up. If the',0
  8374.  dc.b 'button was not blank, the font that was there before will be',0 ;13
  8375.  dc.b 'replaced by the font you choose. If the font name & height button',0
  8376.  dc.b 'is recessed (font 0''s button is always recessed) then you cannot',0
  8377.  dc.b 'load/reload that font.',0 ;16
  8378.  dc.b 'If you click the "View" button of a font, some sample text in that',0
  8379.  dc.b 'font will appear in the big box at the right of the requester.',0 ;18
  8380.  dc.b 'If you click a "Choose" button, then you will thereby choose that',0
  8381.  dc.b 'font, and the requester will close. But if a choose button is',0 ;20
  8382.  dc.b 'recessed, you cannot choose that font, since its name and size',0 ;21
  8383.  dc.b 'button is currently blank.',0 ;22
  8384.  ds.w 0
  8385.  
  8386. *>>>> convert hex to ascii in hex format
  8387. ; value in d0
  8388. ; put to (a0)+
  8389. ; d1 = format:  0=left justify  1-8 = 1-8 digits
  8390. TLHexasc16:
  8391.  tst.w d1                  ;go if left justify
  8392.  beq.s .ljst
  8393.  movem.l d0-d2,-(a7)       ;save all except a0 pushed past
  8394.  moveq #8,d2
  8395.  sub.l d1,d2
  8396.  lsl.w #2,d2
  8397.  rol.l d2,d0               ;roll past unshown digits
  8398.  subq.w #1,d1              ;go do digits
  8399.  bra.s .jdgt
  8400. .ljst:                     ;* left justify
  8401.  tst.l d0
  8402.  beq.s .zero               ;go if zero
  8403.  movem.l d0-d2,-(a7)
  8404.  moveq #8,d1               ;shift until a non-zero digit found
  8405. .ljtr:
  8406.  subq.w #1,d1
  8407.  rol.l #4,d0
  8408.  move.b d0,d2
  8409.  and.b #15,d2
  8410.  beq .ljtr
  8411.  ror.l #4,d0               ;d1 = remaining digits - 1
  8412. .jdgt:
  8413.  rol.l #4,d0               ;* get next digit
  8414.  move.b d0,d2
  8415.  and.b #15,d2
  8416.  add.b #'0',d2             ;make into ascii
  8417.  cmp.b #':',d2
  8418.  bcs.s .jcry
  8419.  add.b #'A'-':',d2
  8420. .jcry:
  8421.  move.b d2,(a0)+           ;put digit
  8422.  dbra d1,.jdgt
  8423.  movem.l (a7)+,d0-d2
  8424.  rts
  8425. .zero:                     ;* left justify, d0=0
  8426.  move.b #'0',(a0)+
  8427.  rts
  8428.  
  8429.  
  8430. *>>>> find if an assign exists
  8431. TLAssdev:
  8432.  movem.l d1-d7/a0-a6,-(a7)       ;save all regs except d0
  8433.  move.l xxp_dosb(a4),a6          ;a6=dosbase
  8434.  move.l #LDF_READ!LDF_ASSIGNS,d7 ;D7=flags
  8435.  move.l d7,d1
  8436. ** Do NOT single step or breakpoint herein ***
  8437.  jsr _LVOLockDosList(a6)                    ;*  lock DOS list
  8438.  move.l d0,d1                               ;*  d1=list code
  8439.  move.l a4,d2                               ;*  d2=name (w'out :)
  8440.  move.l d7,d3                               ;*  d3=flags
  8441.  jsr _LVOFindDosEntry(a6)                   ;*  in dos list?
  8442.  tst.l d0                                   ;*  EQ if doesn't exist
  8443.  beq.s .no                                  ;*
  8444.  move.l d0,a0                               ;*  else, point to node
  8445.  move.l dol_Lock(a0),d1                     ;*  get its lock
  8446.  jsr _LVODupLock(a6)                        ;*  & duplicate it
  8447. .no:                                        ;*
  8448.  move.l d0,-(a7)                            ;*  save 0/duplicate lock
  8449.  move.l d7,d1                               ;*  reset flags
  8450.  jsr _LVOUnLockDosList(a6)                  ;*  unlock doslist
  8451. **********************************************
  8452.  move.l (a7)+,d0                  ;d0 is duplicate lock, or zero
  8453.  beq.s .quit                      ;quit if doesn't exist (when D0=0)
  8454.  move.l d0,d1
  8455.  move.l d1,-(a7)
  8456.  move.l a4,d2
  8457.  move.l #150,d3
  8458.  jsr _LVONameFromLock(a6)         ;put name in buff
  8459.  move.l (a7)+,d1
  8460.  jsr _LVOUnLock(a6)               ;unlock the duplicate lock
  8461.  moveq #-1,d0                     ;d0<>0 if exists
  8462. .quit:
  8463.  movem.l (a7)+,d1-d7/a0-a6
  8464.  rts
  8465.  
  8466. *>>>> set up xxp_Menu, given NewMenu structure in A0
  8467.  
  8468. ; Note: the TLnm structure can be re-used - although it is modified by
  8469. ; TLReqmenu, it can be re-called, and will not be re-modified; thus this
  8470. ; does not stop the library from being re-entrant, but it must be in RAM.
  8471.  
  8472. TLReqmenu:
  8473.  movem.l d1-d7/a0-a6,-(a7) ;save all regs exc d0
  8474.  clr.l xxp_errn(a4)
  8475.  move.l xxp_AcWind(a4),a5
  8476.  move.l a0,a1              ;tidy up the NewMenu structure...
  8477.  move.l a0,a2              ;a2 saves a0
  8478.  sub.l a3,a3               ;(a3 will be string of hotkey letters in order)
  8479. .item:
  8480.  cmp.b #NM_END,gnm_Type(a1) ;done if NM_END
  8481.  beq.s .redi
  8482.  move.l gnm_Label(a1),d0   ;get label
  8483.  beq.s .hotky              ;go if none (can't happen?)
  8484.  cmp.l #1025,d0
  8485.  bcc.s .hotky              ;go if not 0<label<1025
  8486.  bsr TLStra0
  8487.  move.l a0,gnm_Label(a1)   ;else point label to that string number
  8488. .hotky:
  8489.  move.l gnm_CommKey(a1),d0 ;get hotkey
  8490.  beq.s .fwd
  8491.  cmp.l #1025,d0            ;go if not 0<hotkey<1025
  8492.  bcc.s .fwd
  8493.  move.l a3,d1              ;hotkeys already started?
  8494.  bne.s .nxky               ;yes, go
  8495.  bsr TLStra0               ;no, point a3 to hotkey string
  8496.  move.l a0,a3
  8497. .nxky:
  8498.  move.l a3,gnm_CommKey(a1) ;point to hotkey
  8499.  addq.l #1,a3              ;& bump hotkey pointer
  8500. .fwd:
  8501.  add.l #gnm_SIZEOF,a1      ;to next menu item
  8502.  bra .item
  8503. .redi:
  8504.  move.l a2,a0              ;NewMenu ok - restore A0
  8505.  subq.l #4,a7
  8506.  clr.l (a7)                ;(null taglist)
  8507.  move.l a7,a1
  8508.  move.l xxp_gadb(a4),a6
  8509.  jsr _LVOCreateMenusA(a6)
  8510.  move.l d0,xxp_Menu(a5)    ;create xxp_Menu
  8511.  addq.l #4,a7
  8512.  beq.s .bad1               ;go if can't (unlikely)
  8513.  move.l d0,a0
  8514.  move.l xxp_vi(a4),a1
  8515.  subq.l #4,a7
  8516.  clr.l (a7)                ;(null taglist)
  8517.  move.l a7,a2
  8518.  jsr _LVOLayoutMenusA(a6)  ;layout menus
  8519.  addq.l #4,a7
  8520.  tst.l d0
  8521.  beq.s .bad2               ;bad if can't (unlikely)
  8522.  moveq #-1,d0
  8523.  bra.s .quit
  8524. .bad1:                     ;bad - out of public memory
  8525.  addq.l #1,xxp_errn(a4)
  8526.  bra.s .bad
  8527. .bad2:                     ;bad - LayoutMenusA failed
  8528.  move.w #30,xxp_errn+2(a4)
  8529. .bad:
  8530.  moveq #0,d0
  8531. .quit:
  8532.  movem.l (a7)+,d1-d7/a0-a6 ;D0=0, EQ if bad
  8533.  rts
  8534.  
  8535. *>>>> attach xxp_Menu to xxp_Window (call Reqmenu first)
  8536. TLReqmuset:
  8537.  movem.l d0-d1/a0-a1/a5-a6,-(a7) ;save all regs
  8538.  move.l xxp_AcWind(a4),a5
  8539.  move.l xxp_intb(a4),a6
  8540.  move.l xxp_Menu(a5),a1
  8541.  move.l xxp_Window(a5),a0
  8542.  jsr _LVOSetMenuStrip(a6)
  8543.  subq.w #1,xxp_Menuon(a5)
  8544.  movem.l (a7)+,d0-d1/a0-a1/a5-a6
  8545.  rts
  8546.  
  8547. *>>>> detatch xxp_Menu from xxp_Window (call Reqmuset first)
  8548. TLReqmuclr:
  8549.  movem.l d0-d1/a0-a1/a5-a6,-(a7) ;save all regs
  8550.  move.l xxp_AcWind(a4),a5
  8551.  tst.l xxp_Menu(a5)   ;go if menu does not exist/not attached
  8552.  beq.s .done
  8553.  tst.w xxp_Menuon(a5)
  8554.  beq.s .done
  8555.  move.l xxp_intb(a4),a6
  8556.  move.l xxp_Window(a5),a0
  8557.  jsr _LVOClearMenuStrip(a6)
  8558.  clr.w xxp_Menuon(a5)
  8559. .done:
  8560.  movem.l (a7)+,d0-d1/a0-a1/a5-a6
  8561.  rts
  8562.  
  8563. *>>>> show information D0=1st str, D1=no. of strings
  8564. ; D2:  1=ok box  2=ok & canc boxes   3=custom boxes in last str
  8565. TLReqinfo:
  8566.  move.l xxp_butx(a4),-(a7) ;save button data
  8567.  move.l xxp_buty(a4),-(a7)
  8568.  move.l xxp_butw(a4),-(a7)
  8569.  move.l xxp_buth(a4),-(a7)
  8570.  move.l xxp_btdx(a4),-(a7)
  8571.  move.l xxp_btdy(a4),-(a7)
  8572.  move.l xxp_butk(a4),-(a7)
  8573.  move.l xxp_butl(a4),-(a7)
  8574.  
  8575.  movem.l d0-d7/a0-a6,-(a7)
  8576.  move.l a7,xxp_Stak(a4)
  8577.  movem.l d0-d1,-(a7)    ;save input d0-d1
  8578.  move.l #.ok,-(a7)      ;addr of boxes string here
  8579.  sub.w #xxp_WPort+4,a7  ;create dummy part xxp_wsuw
  8580.  
  8581.  move.l a7,a5           ;a5 points to dummy IntuiText
  8582.  bsr TLReqredi          ;set pop window
  8583.  beq .bad               ;(go if init fails - unlikely)
  8584.  
  8585.  move.l xxp_pref(a4),a0 ;prefs to prfp
  8586.  move.l xxp_yinf(a0),xxp_prfp(a4)
  8587.  move.l xxp_yinf+4(a0),xxp_prfp+4(a4)
  8588.  cmp.l #2,d2            ;boxes str address to stack
  8589.  bcs.s .rcyc
  8590.  bne.s .boxs
  8591.  move.l #.oc,xxp_WPort+4(a7)
  8592.  bra.s .rcyc
  8593. .boxs:
  8594.  subq.w #1,d1
  8595.  subq.l #1,xxp_WPort+12(a7) ;(1 string less in both d1, & d1 in stack)
  8596.  add.w d1,d0
  8597.  bsr TLStra0
  8598.  move.l a0,xxp_WPort+4(a7)
  8599.  
  8600. .rcyc:
  8601.  move.l xxp_WPort+8(a7),d0 ;restore input d0,d1 - see if fits
  8602.  move.l xxp_WPort+12(a7),d1
  8603.  move.l xxp_WPort+4(a7),a0 ;set button size & num
  8604.  move.l xxp_AcWind(a4),-(a7)
  8605.  move.l a5,xxp_AcWind(a4)
  8606.  bsr TLButstr
  8607.  move.l (a7)+,xxp_AcWind(a4)
  8608.  
  8609.  bsr TLStra0            ;set D2 to max string width
  8610.  move.l a0,a3
  8611.  moveq #0,d2
  8612.  move.w d1,d0
  8613.  subq.w #1,d0
  8614. .scan:
  8615.  move.l a0,xxp_IText(a5)
  8616.  bsr TLTszdo            ;get size of next string
  8617.  cmp.w d4,d2
  8618.  bcc.s .maxw
  8619.  move.w d4,d2
  8620. .maxw:
  8621.  tst.b (a0)+
  8622.  bne .maxw
  8623.  dbra d0,.scan          ;until all string widths scanned
  8624.  
  8625.  move.l d2,d0           ;set D2 to requester width
  8626.  bsr TLButfix
  8627.  
  8628.  cmp.l xxp_Width(a4),d2 ;retry &c if too wide
  8629.  ble.s .gtht
  8630.  tst.b xxp_prfp+3(a4)   ;retry w. horz=0 if horz<>0
  8631.  beq.s .wdt1
  8632.  subq.b #1,xxp_prfp+3(a4)
  8633.  bra .rcyc
  8634. .wdt1:
  8635.  tst.w xxp_Tspc(a5)     ;retry w. Tspc=0 if Tspc<>0
  8636.  beq.s .wdt2
  8637.  subq.w #1,xxp_Tspc(a5)
  8638.  bra .rcyc
  8639. .wdt2:
  8640.  tst.w xxp_Fnum(a5)     ;retry w. Fnum=0 if Fnum<>0
  8641.  beq.s .gtht            ;(else, will be too big to fit)
  8642. .fon0:
  8643.  moveq #0,d0            ;attach font 0 to dummy xxp_wsuw
  8644.  moveq #0,d1            ;(will be passed on by TLReqon)
  8645.  moveq #0,d2
  8646.  bsr TLAnyfont
  8647.  bne .rcyc
  8648.  
  8649. .gtht:
  8650.  move.w d6,d3           ;set d3 = requester height
  8651.  mulu d1,d3             ;d3=character ht * lines
  8652.  addq.l #4,d3           ;d3=requester height (before buttons)
  8653.  move.l d3,xxp_buty(a4)
  8654.  clr.l xxp_btdy(a4)
  8655.  add.l xxp_buth(a4),d3
  8656.  moveq #0,d0
  8657.  move.b xxp_prfp+4(a4),d0  ;d0 = pref vert
  8658.  beq.s .htgt
  8659.  addq.w #1,d3           ;inc height by 1 if pref vert <> 0
  8660. .htgt:
  8661.  add.l d0,d3
  8662.  
  8663.  cmp.l xxp_Height(a4),d3 ;go if fits on screen
  8664.  ble.s .chek
  8665.  tst.b xxp_prfp+4(a4)   ;if not, redo with vert=0 if vert <>0
  8666.  beq.s .vtt1
  8667.  subq.b #1,xxp_prfp+4(a4)
  8668.  bra .rcyc
  8669. .vtt1:
  8670.  tst.w xxp_Fnum(a5)     ;redo with Fnum=0 if Fnum<>0
  8671.  bne .fon0              ;(else will be too big)
  8672.  
  8673. .chek:
  8674.  bsr TLReqchek          ;check req dims, &c
  8675.  beq .bad               ;go if won't fit
  8676.  
  8677.  tst.w xxp_ReqNull(a4)  ;go if ReqNull=0
  8678.  beq .wrap
  8679.  
  8680.  bsr TLReqon            ;open requester window
  8681.  beq .bad               ;go if can't
  8682.  move.b xxp_prfp+2(a4),xxp_FrontPen(a5)
  8683.  move.b xxp_prfp(a4),xxp_BackPen(a5)
  8684.  
  8685.  bsr TLButprt           ;draw buttons & text therein
  8686.  move.l xxp_WPort+4(a7),a0
  8687.  bsr TLButtxt
  8688.  move.b xxp_prfp+1(a4),xxp_FrontPen(a5)
  8689.  
  8690.  move.l d1,d3             ;print strings
  8691.  subq.w #1,d3
  8692.  moveq #4,d0
  8693.  moveq #2,d1
  8694. .prnt:
  8695.  move.l a3,xxp_IText(a5)
  8696.  bsr TLText
  8697.  move.b xxp_prfp+2(a4),xxp_FrontPen(a5)
  8698.  add.w d6,d1
  8699. .eos:
  8700.  tst.b (a3)+
  8701.  bne .eos
  8702.  dbra d3,.prnt
  8703.  
  8704.  bsr TLHook2
  8705.  
  8706. .wait:
  8707.  move.l xxp_strg(a4),-(a7) ;if no help, attach default
  8708.  move.l xxp_Help(a4),-(a7)
  8709.  bne.s .wtdo
  8710.  move.l #.str,xxp_strg(a4)
  8711.  move.l #$00010003,xxp_Help(a4)
  8712.  cmp.w #1,xxp_butk+2(a4)
  8713.  beq.s .wtdo
  8714.  addq.w #3,xxp_Help(a4)
  8715. .wtdo:
  8716.  bsr TLWfront           ;get keyboard
  8717.  bsr TLKeyboard
  8718.  move.l (a7)+,xxp_Help(a4)
  8719.  move.l (a7)+,xxp_strg(a4)
  8720.  
  8721.  cmpi.l #2,xxp_butk(a4) ;bra according to number of buttons
  8722.  beq.s .wt2
  8723.  bcc.s .wt3
  8724.  
  8725.  cmp.b #$0D,d0         ;one button: return 1 if <Return>
  8726.  beq.s .rt1
  8727.  bra.s .wt3
  8728.  
  8729. .wt2:
  8730.  btst #6,d3            ;two buttons: return 1 if LfAm / v
  8731.  beq.s .wt3            ;             return 2 if LfAm / b
  8732.  cmp.b #'v',d0
  8733.  beq.s .rt1
  8734.  cmp.b #'b',d0
  8735.  beq.s .rt2
  8736.  bra.s .wt3
  8737.  
  8738. .rt1:
  8739.  moveq #1,d0
  8740.  bra.s .func
  8741.  
  8742. .rt2:
  8743.  moveq #2,d0
  8744.  bra.s .func
  8745.  
  8746. .wt3:
  8747.  sub.w #$80,d0          ;go if F1+
  8748.  bgt.s .func
  8749.  bne .wait              ;retry if not lmb
  8750.  
  8751.  bsr TLButmon           ;D0=which of buttons
  8752.  tst.w d0
  8753.  beq .wait              ;retry if none
  8754.  bra.s .clos
  8755.  
  8756. .func:
  8757.  cmp.l xxp_butk(a4),d0  ;accept F1+ if in range: F1+ sets D0=1+
  8758.  bgt .wait
  8759.  
  8760. .clos:
  8761.  bsr TLReqoff           ;close req window
  8762.  bra.s .wrap            ;return ok
  8763.  
  8764. .bad:
  8765.  moveq #0,d0            ;too big/can't open window
  8766.  
  8767. .wrap:
  8768.  move.w #-1,xxp_ReqNull(a4) ;leave ReqNull<>0
  8769.  bsr TLWslof
  8770.  tst.l d0               ;EQ, D0=0 if bad
  8771.  add.w #xxp_WPort+4,a7
  8772.  add.w #12,a7
  8773.  move.l d0,(a7)
  8774.  movem.l (a7)+,d0-d7/a0-a6
  8775.  
  8776.  move.l (a7)+,xxp_butl(a4) ;restore button data
  8777.  move.l (a7)+,xxp_butk(a4)
  8778.  move.l (a7)+,xxp_btdy(a4)
  8779.  move.l (a7)+,xxp_btdx(a4)
  8780.  move.l (a7)+,xxp_buth(a4)
  8781.  move.l (a7)+,xxp_butw(a4)
  8782.  move.l (a7)+,xxp_buty(a4)
  8783.  move.l (a7)+,xxp_butx(a4)
  8784.  tst.l d0                  ;EQ, D0=0 if bad
  8785.  rts
  8786.  
  8787. .str: dc.b 0
  8788.  dc.b 'This requester contains information for your perusal.',0 ;1
  8789.  dc.b 'When you have read it, click the "OK" button at the bottom',0 ;2
  8790.  dc.b 'of the requester.',0 ;3
  8791.  dc.b 'This requester contains information so you can choose.',0 ;5
  8792.  dc.b 'To make your choice, click one of the buttons at the bottom',0 ;6
  8793.  dc.b 'of the requester (or press F1+)(if 2 buttons Left Amiga v/b).',0 ;7
  8794.  
  8795. .ok: dc.b 'OK',0        ;boxes if D2=1
  8796. .oc: dc.b 'OK\Cancel',0 ;boxes if D2=2
  8797.  ds.w 0
  8798.  
  8799. *>>>> Display a set of lines with dynamically calculated contents
  8800. TLReqshow:
  8801.  
  8802. * On call:  D0=hail  D1= total lines  D2 = lines on window  D3 = topline
  8803. ;           Set bit 31 of D2 for dumb seek, bits 31,30 of D2 for smart seek
  8804. ;           A0 = Callback routine address
  8805.  
  8806. * User sets xxp_Hook with a callback routine...
  8807. ;
  8808. ; If TLReqshow wants to show a line, it sets D0 = linum
  8809. ; Caller sends back:  A0 points to line
  8810. ;
  8811. ; If user clicks line, TLReqshow sends D0 = linum, with bit 31 set
  8812. ; Caller sends back:  D0 < 0   for nothing
  8813. ;                     D0 = 0   quit (quits "bad", with xxp_errn = 0)
  8814. ;                     D0 = 1   redo no line comp'ed
  8815. ;                     D0 = 2   redo with that line comp'ed
  8816. ;                     D0 = 3   redo with new D1,D3
  8817. ;
  8818. ; Smart search, TLreqshow sets D0 = linum, D1: 1/2/3 = for/back/left
  8819. ; Caller sends back:  D0 = -2  do dumb search
  8820. ;                     D0 = -1  string (in xxp_patt) unfound
  8821. ;                     D0 = 0+  = new topline
  8822.  
  8823. ; TLReqshow - push calling regs, set xxp_Stak
  8824.  
  8825.  move.l xxp_butx(a4),-(a7) ;save button data
  8826.  move.l xxp_buty(a4),-(a7)
  8827.  move.l xxp_butw(a4),-(a7)
  8828.  move.l xxp_buth(a4),-(a7)
  8829.  move.l xxp_btdx(a4),-(a7)
  8830.  move.l xxp_btdy(a4),-(a7)
  8831.  move.l xxp_butk(a4),-(a7)
  8832.  move.l xxp_butl(a4),-(a7)
  8833.  
  8834.  move.l xxp_slix(a4),-(a7) ;save slider data
  8835.  move.l xxp_sliy(a4),-(a7)
  8836.  move.l xxp_sliw(a4),-(a7)
  8837.  move.l xxp_slih(a4),-(a7)
  8838.  move.l xxp_tops(a4),-(a7)
  8839.  move.l xxp_totl(a4),-(a7)
  8840.  move.l xxp_strs(a4),-(a7)
  8841.  move.l xxp_hook(a4),-(a7)
  8842.  
  8843.  movem.l d0-d7/a0-a6,-(a7) ;saves all except result in d0
  8844.  move.l a7,xxp_Stak(a4)    ;point to where caller regs stored
  8845.  clr.l xxp_errn(a4)        ;no error so far
  8846.  
  8847. ; TLReqshow -  create requester window
  8848.  
  8849.  move.l a0,xxp_Hook(a4)    ;* input A0 = caller hook address, to xxp_Hook
  8850.  sub.w #xxp_WPort+4,a7     ;* create dummy part xxp_wsuw
  8851.  
  8852.  move.l a7,a5              ;a5 points to dummy IntuiText
  8853.  bsr TLReqredi             ;set pop window
  8854.  beq .bad0                 ;* go if TLReqredi fails - unlikely
  8855.  
  8856.  move.l xxp_pref(a4),a0    ;prefs to prfp
  8857.  move.l xxp_yshw(a0),xxp_prfp(a4)
  8858.  move.l xxp_yshw+4(a0),xxp_prfp+4(a4)
  8859.  
  8860.  bsr TLStrbuf              ;* input D0 = hail strnum; tfr hail to xxp_buff
  8861.  move.l d3,xxp_tops(a4)    ;* input D3 = init topline, to xxp_tops
  8862.  move.l d1,xxp_totl(a4)    ;* input D1 = total strings, to xxp_totl
  8863.  move.l #11,xxp_buth(a4)   ;set up data for drawing buttons
  8864.  move.l #206,xxp_butw(a4)  ;(buttons width = 206 if no seeking)
  8865.  move.l #3,xxp_butk(a4)    ;(3 buttons if not seeking)
  8866.  move.l #1,xxp_butl(a4)    ;(1 row of buttons)
  8867.  
  8868.  tst.l d2                  ;* bit 31 of d2 set? (yes = seek)
  8869.  bpl.s .nosk               ;go if no seeking
  8870.  bclr #31,d2               ;clear bit 31 of d2
  8871.  clr.b xxp_patt+31(a4)     ;xxp_patt+31 = 0 if dumb seek
  8872.  btst #30,d2               ;* bit 30 of d2 set? (yes = smart seek)
  8873.  beq.s .dumsk              ;go if dumb seeking
  8874.  bclr #30,d2               ;clear bit 30 of d2
  8875.  subq.b #1,xxp_patt+31(a4) ;xxp_patt+31 = -1 if smart seek
  8876. .dumsk:
  8877.  move.l #103,xxp_butw(a4)  ;(buttons width = 103 if seeking)
  8878.  move.l #6,xxp_butk(a4)    ;(6 buttons if seeking)
  8879.  clr.b xxp_patt(a4)        ;so far, no search pattern
  8880. .nosk:
  8881.  
  8882.  move.l d2,xxp_strs(a4)    ;* input D2 = strs on window, to xxp_strs
  8883.  move.l d2,d3
  8884.  move.l #640,d2            ;d2=req width (always 640)
  8885.  lsl.l #3,d3
  8886.  add.l #11,d3              ;d3=req height without bot butts (8 * D2 + 11)
  8887.  clr.l xxp_butx(a4)        ;(buttons xpos = 0)
  8888.  move.l xxp_butw(a4),xxp_btdx(a4) ;(buttons dx = width, i.e. all touch)
  8889.  clr.l xxp_btdy(a4)        ;(buttons dy =0, undefined since 1 row)
  8890.  move.l d3,xxp_buty(a4)    ;(buttons ypos = 8 * D2 + 11)
  8891.  add.l #11,d3              ;d3=req height (8 * D2 + 22)
  8892.  move.l a4,xxp_IText(a5)   ;set for printing
  8893.  
  8894.  bsr TLReqchek             ;* fix requester dims, &c
  8895.  beq .bad1                 ;* go if TLReqchek fails (only if too big D2)
  8896.  
  8897.  tst.w xxp_ReqNull(a4)     ;* quit if ReqNull = 0
  8898.  beq .null
  8899.  
  8900.  bsr TLReqon               ;* create requester window
  8901.  beq .bad0                 ;quit if can't (out of chip ram)
  8902.  move.l xxp_AcWind(a4),a5  ;a5 now points to actual window
  8903.  
  8904.  clr.w xxp_Tspc(a5)        ;Reqshow uses Fnum=11 Fsty=0 Tspc=0
  8905.  moveq #11,d0
  8906.  move.l xxp_FSuite(a4),a0
  8907.  tst.l xxp_fsiz*11(a0)     ;or, Fnum=0 if no font 11, or font 8 height <> 8
  8908.  beq.s .fnt0
  8909.  cmp.w #8,xxp_fsiz*11+4(a0)
  8910.  beq.s .fnt8
  8911. .fnt0:
  8912.  moveq #0,d0
  8913. .fnt8:
  8914.  move.l d0,d3              ;recall fnum
  8915.  moveq #0,d1               ;attach font
  8916.  moveq #0,d2
  8917.  bsr TLNewfont
  8918.  bne.s .fnto               ;go if success
  8919.  tst.w d3
  8920.  bne .fnt0                 ;if can't, retry if wasn't font 0
  8921.  bra .bad0                 ;bad if can't even open font 0 (impossible?)
  8922. .fnto:
  8923.  
  8924.  move.l xxp_FSuite(a4),a0  ;get font, ensure fixed
  8925.  mulu #xxp_fsiz,d3
  8926.  beq.s .fixt               ;(always fixed width 8 if font 0)
  8927.  add.l d3,a0
  8928.  move.l xxp_plain(a0),a2   ;a2 = font
  8929.  btst #5,tf_Flags(a2)      ;reject font if proportional
  8930.  bne .fnt0
  8931.  
  8932.  move.w tf_XSize(a2),d0    ;set xxp_rinf,slix,sliw
  8933.  bne.s .some
  8934. .fixt:
  8935.  moveq #8,d0               ;(set 8 if 0 - can't happen?)
  8936. .some:
  8937.  move.l #622,d1            ;minimum slider width 18
  8938.  divu d0,d1                ;d1 = chrs that will fit
  8939.  and.l #$0000FFFF,d1
  8940.  mulu d1,d0                ;d0 = total chrs width
  8941.  add.l a4,d1
  8942.  move.l d1,xxp_rinf(a4)    ;set rinf = buff data cutoff point
  8943.  addq.l #2,d0
  8944.  move.l d0,xxp_slix(a4)    ;set slix
  8945.  neg.l d0
  8946.  add.l #640,d0
  8947.  move.l d0,xxp_sliw(a4)    ;set sliw
  8948.  
  8949.  moveq #4,d0               ;print hail
  8950.  moveq #2,d1
  8951.  move.b xxp_prfp+1(a4),xxp_FrontPen(a5)
  8952.  move.b xxp_prfp(a4),xxp_BackPen(a5)
  8953.  bsr TLText
  8954.  
  8955.  bsr TLButprt              ;draw buttons
  8956.  
  8957.  lea .prmp0,a0             ;draw buttono text
  8958.  cmp.l #3,xxp_butk(a4)
  8959.  beq.s .butt
  8960.  lea .prmp1,a0
  8961. .butt:
  8962.  bsr TLButtxt              ;draw button text
  8963.  
  8964.  clr.l xxp_sliy(a4)        ;set up slider
  8965.  move.l xxp_reqh(a4),xxp_slih(a4)
  8966.  
  8967.  move.l #.echo,xxp_hook(a4) ;TLSlider callback hook to .echo
  8968.  
  8969. ; TLReqshow - recycle here if new topline
  8970.  
  8971. .rcyc:
  8972.  move.l xxp_Stak(a4),-(a7) ;(preserve Stak for caller of TLReqshow)
  8973.  bsr TLSlider              ;redraw lines in window, slider (calls .echo)
  8974.  move.l (a7)+,xxp_Stak(a4)
  8975.  
  8976. ; TLReqshow - recycle here to wait for input
  8977.  
  8978. .wait:
  8979.  move.l xxp_Help(a4),-(a7) ;attach default string if required
  8980.  move.l xxp_strg(a4),-(a7)
  8981.  tst.l xxp_Help(a4)        ;go if help set
  8982.  bne.s .wtdo
  8983.  move.l #.strs,xxp_strg(a4) ;else use default help
  8984.  move.w #1,xxp_Help(a4)
  8985.  move.w #20,xxp_Help+2(a4)
  8986.  cmp.l #6,xxp_butk(a4)
  8987.  beq.s .wtdo
  8988.  subq.w #5,xxp_Help+2(a4)
  8989. .wtdo:
  8990.  bsr TLWfront
  8991.  bsr TLKeyboard            ;wait for keyboard (discards mouseups)
  8992.  move.l (a7)+,xxp_strg(a4)
  8993.  move.l (a7)+,xxp_Help(a4)
  8994.  
  8995.  
  8996. ; TLReqshow - process keyboard input
  8997.  
  8998.  cmp.b #$1B,d0             ;quit if Esc
  8999.  beq .good
  9000.  cmp.b #$8E,d0             ;up arrow
  9001.  beq .up
  9002.  cmp.b #$8F,d0             ;down arrow
  9003.  beq .down
  9004.  cmp.b #$80,d0
  9005.  bne .wait                 ;discard if not mousedown
  9006. .clik:                     ;* user has pressed lmb
  9007.  move.l xxp_Stak(a4),-(a7) ;keep xxp_Stak for caller to TLReqshow
  9008.  bsr TLSlimon              ;do slider if clicked
  9009.  move.l (a7)+,xxp_Stak(a4)
  9010.  tst.l d0
  9011.  bne .wait
  9012.  
  9013.  move.l d2,d0              ;else, see if a line clicked
  9014.  sub.w #11,d0
  9015.  bcs .wait
  9016.  lsr.l #3,d0
  9017.  cmp.l xxp_strs(a4),d0     ;d0=line rel to window
  9018.  bcs .clikt                ;go if a line clicked
  9019.  
  9020.  bsr TLButmon              ;see if a button clicked
  9021.  beq .wait                 ;go if not
  9022.  cmp.w #2,d0
  9023.  bcs .strt                 ;go if start button
  9024.  beq .endl                 ;go if end button
  9025.  cmp.l #3,xxp_butk(a4)
  9026.  beq .good                 ;quit if only 3 buttons (=can't seek)
  9027.  cmp.w #6,d0
  9028.  bcs .seek                 ;go if seek fore/back/left
  9029.  bra .good                 ;go if quit
  9030.  
  9031. ; TLReqshow - line clicked
  9032.  
  9033. .clikt:                    ;D0=line num clicked rel to tops
  9034.  add.l xxp_tops(a4),d0     ;D0=line no. clicked
  9035.  cmp.l xxp_totl(a4),d0     ;go if no such line
  9036.  bcc .wait
  9037.  bset #31,d0               ;set bit 31 to show Hook that clicked
  9038.  movem.l d0/a4-a5,-(a7)
  9039.  move.l xxp_Hook(a4),a0
  9040.  jsr (a0)
  9041.  move.l d0,d2              ;D2 = code returned by Hook
  9042.  movem.l (a7)+,d0/a4-a5
  9043.  bmi .wait                 ;if hook = <0, do nothing
  9044.  beq .bad2                 ;if hook = 0, quit "bad" but with xxp_errn=0
  9045.  bclr #31,d0               ;D0 = line clicked
  9046.  move.l #-1,xxp_lcom(a4)   ;nothing as yet comp
  9047.  cmp.l #2,d2
  9048.  bcs .rcyc                 ;if hook = 1, redo w'out comp
  9049.  bne.s .rdrw
  9050.  move.l d0,xxp_lcom(a4)    ;if hook = 2, redo with comp
  9051.  bra .rcyc
  9052. .rdrw:                     ;if hook = 3, redraw with new D1,D3 (& no comp)
  9053.  move.l d1,xxp_totl(a4)
  9054.  move.l d3,xxp_tops(a4)
  9055.  bra .rcyc
  9056.  
  9057. ; TLReqshow - up arrow pressed
  9058.  
  9059. .up:
  9060.  btst #0,d3                ;if shift, -> up a window full
  9061.  bne.s .upw
  9062.  tst.l xxp_tops(a4)        ;ignore if already at top
  9063.  beq .wait
  9064.  subq.l #1,xxp_tops(a4)    ;dec topline
  9065.  bra .rcyc
  9066. .upw:                      ;* up a window full
  9067.  move.l xxp_tops(a4),d0
  9068.  beq .wait                 ;ignore if already at top
  9069.  sub.l xxp_strs(a4),d0
  9070.  addq.l #1,d0              ;allow 1 line overlap
  9071.  bpl.s .upwc
  9072.  moveq #0,d0
  9073. .upwc:
  9074.  move.l d0,xxp_tops(a4)    ;re-do with new xxp_tops
  9075.  bra .rcyc
  9076.  
  9077. ; TLReqshow - down arrow pressed
  9078.  
  9079. .down:                     ;* down arrow
  9080.  move.l xxp_tops(a4),d0
  9081.  addq.l #1,d0              ;d0 = proposed next topline
  9082.  cmp.l xxp_totl(a4),d0
  9083.  bcc .wait                 ;ignore if past end
  9084.  btst #0,d3
  9085.  bne.s .dnw                ;down a window full if shift
  9086.  move.l d0,xxp_tops(a4)    ;else, down a line
  9087.  bra .rcyc
  9088. .dnw:                      ;* down a window full
  9089.  move.l xxp_strs(a4),d7
  9090.  subq.l #1,d7
  9091.  add.l d7,d0
  9092. .dncu:
  9093.  subq.l #1,d0              ;allow 1 line overlap
  9094.  cmp.l xxp_totl(a4),d0
  9095.  bcc .dncu
  9096.  move.l d0,xxp_tops(a4)    ;set new xxp_tops
  9097.  bra .rcyc
  9098.  
  9099. ; TLReqshow - end button clicked
  9100.  
  9101. .endl:
  9102.  move.l xxp_totl(a4),d0
  9103.  sub.l xxp_strs(a4),d0
  9104.  bcc .skgd
  9105.  
  9106. ; TLReqshow - start button clicked
  9107.  
  9108. .strt:
  9109.  moveq #0,d0
  9110.  bra .skgd
  9111.  
  9112. ; TLReqshow - seek fwd/back/left clicked
  9113.  
  9114. .seek:                     ;d0: 3=fore 4=back 5=left
  9115.  bsr .rqstr                ;get string sought to xxp_patt
  9116.  tst.b xxp_patt(a4)
  9117.  beq .wait                 ;go if cancel/null
  9118.  bsr TLBusy
  9119.  move.l d0,d1              ;d1 = 3/4/5 = fore/back/left
  9120.  tst.b xxp_patt+31(a4)     ;go if dumb seek
  9121.  beq.s .dumb
  9122.  
  9123.  move.l xxp_tops(a4),d0    ;* smart search: start from tops
  9124.  bset #31,d0
  9125.  bset #30,d0               ;set bits 31,30
  9126.  move.l xxp_Hook(a4),a0
  9127.  movem.l d1/a4-a5,-(a7)
  9128.  jsr (a0)                  ;call hook
  9129.  movem.l (a7)+,d1/a4-a5
  9130.  addq.l #2,d0
  9131.  beq.s .dumb               ;do dumb search after all if d0 = -2
  9132.  subq.l #1,d0
  9133.  beq .unsk                 ;can't find if d0 = -1
  9134.  subq.l #1,d0
  9135.  bra .skgd                 ;else, found - result in D0
  9136.  
  9137. .dumb:                     ;* dumb search: d1 = 3/4/5
  9138.  move.l a4,a3
  9139.  add.w #xxp_patt,a3
  9140.  move.b (a3)+,d7           ;a3=sought+1, d7=1st chr
  9141.  cmp.w #4,d1
  9142.  bcs.s .fore               ;go if seek fore
  9143.  beq.s .back               ;go if seek back
  9144.  
  9145.  moveq #0,d0               ;* seek left...
  9146. .skln:
  9147.  movem.l d0/d7/a3-a5,-(a7)
  9148.  move.l xxp_Hook(a4),a0
  9149.  jsr (a0)                  ;get next
  9150.  movem.l (a7)+,d0/d7/a3-a5
  9151.  cmp.b (a0)+,d7            ;frst chr same?
  9152.  bne.s .skld               ;no, to next line
  9153.  bsr .skcm                 ;matched rest
  9154.  beq .skgd                 ;go if got
  9155. .skld:
  9156.  addq.l #1,d0              ;to next line
  9157.  cmp.l xxp_totl(a4),d0
  9158.  bne .skln                 ;& try it
  9159.  bra .unsk                 ;bad if no more
  9160.  
  9161. .fore:                     ;* seek fore
  9162.  move.l xxp_tops(a4),d0    ;start from tops
  9163.  bra.s .forf
  9164. .forn:
  9165.  bsr .skcl                 ;see if line matches
  9166.  beq.s .skgd               ;go if yes
  9167. .forf:
  9168.  addq.l #1,d0              ;fore a line
  9169.  cmp.l xxp_totl(a4),d0
  9170.  bne .forn                 ;& try it
  9171.  bra.s .unsk               ;bad if no more
  9172.  
  9173. .back:                     ;seek back
  9174.  move.l xxp_tops(a4),d0    ;start from tops
  9175.  bra.s .bacb
  9176. .bakn:
  9177.  bsr .skcl                 ;see if line matches
  9178.  beq.s .skgd               ;go if yes
  9179. .bacb:
  9180.  subq.l #1,d0              ;back a line
  9181.  bcc .bakn                 ;& try it
  9182.  bra.s .unsk               ;bad if no more
  9183.  
  9184. .skgd:                     ;* seek found
  9185.  move.l d0,xxp_tops(a4)
  9186.  bsr TLUnbusy
  9187.  bra .rcyc
  9188.  
  9189. .unsk:                     ;* seek unfound
  9190.  bsr TLUnbusy
  9191.  move.l xxp_intb(a4),a6    ;beep
  9192.  move.l xxp_Screen(a4),a0
  9193.  jsr _LVODisplayBeep(a6)
  9194.  bra .wait
  9195.  
  9196. ; TLReqshow - Quit bad
  9197.  
  9198. .bad0:                    ;* bad 0 - out of chip ram
  9199.  addq.l #2,xxp_errn(a4)
  9200.  moveq #0,d0
  9201.  bra.s .wrpc
  9202. .bad1:                    ;* bad 1 - window won't fit (bad input D2)
  9203.  move.w #21,xxp_errn+2(a4)
  9204.  moveq #0,d0
  9205.  bra.s .wrpc
  9206. .bad2:                    ;* "bad" 2 - hook returns quit (leaves xxp_errn=0)
  9207.  moveq #0,d0
  9208.  bra.s .wrap
  9209.  
  9210. ; TLReqshow - Quit good
  9211.  
  9212. .null:                     ;* return good: xxp_ReqNull set
  9213.  moveq #-1,d0
  9214.  bra.s .wrpc
  9215. .good:                     ;* return good: Esc or Quit button pressed
  9216.  moveq #-1,d0
  9217. .wrap:
  9218.  bsr TLReqoff              ;requester off
  9219. .wrpc:
  9220.  bsr TLWslof               ;clear keyboard queues
  9221.  move.w #-1,xxp_ReqNull(a4) ;always return with xxp_ReqNull off
  9222.  add.w #xxp_WPort+4,a7     ;clear stack
  9223.  move.l d0,(a7)
  9224.  movem.l (a7)+,d0-d7/a0-a6
  9225.  
  9226.  move.l (a7)+,xxp_hook(a4) ;restore slider data
  9227.  move.l (a7)+,xxp_strs(a4)
  9228.  move.l (a7)+,xxp_totl(a4)
  9229.  move.l (a7)+,xxp_tops(a4)
  9230.  move.l (a7)+,xxp_slih(a4)
  9231.  move.l (a7)+,xxp_sliw(a4)
  9232.  move.l (a7)+,xxp_sliy(a4)
  9233.  move.l (a7)+,xxp_slix(a4)
  9234.  
  9235.  move.l (a7)+,xxp_butl(a4) ;restore button data
  9236.  move.l (a7)+,xxp_butk(a4)
  9237.  move.l (a7)+,xxp_btdy(a4)
  9238.  move.l (a7)+,xxp_btdx(a4)
  9239.  move.l (a7)+,xxp_buth(a4)
  9240.  move.l (a7)+,xxp_butw(a4)
  9241.  move.l (a7)+,xxp_buty(a4)
  9242.  move.l (a7)+,xxp_butx(a4)
  9243.  
  9244.  tst.l d0                  ;EQ, D0=0 if bad
  9245.  rts
  9246.  
  9247. ;*********************** TLReqshow Subroutines *************************
  9248.  
  9249. ; TLReqshow Subroutine - compare a whole line
  9250.  
  9251. .skcl:                     ;** compare whole line
  9252.  movem.l d0/d7/a3-a5,-(a7) ;d0=linum, d7=1st chr, a3=rest of str
  9253.  move.l xxp_Hook(a4),a0
  9254.  jsr (a0)
  9255.  movem.l (a7)+,d0/d7/a3-a5
  9256. .skcf:
  9257.  tst.b (a0)                ;return NE if eol
  9258.  beq.s .skcq
  9259.  cmp.b (a0)+,d7            ;cmp next chr
  9260.  bne .skcf                 ;go if unmatched
  9261.  bsr.s .skcm               ;compare rest
  9262.  bne .skcf                 ;go if unmatched
  9263.  rts                       ;return EQ if matched
  9264. .skcq
  9265.  moveq #-1,d1              ;NE if unmatched
  9266.  rts
  9267.  
  9268. ; TLReqshow Subroutine - compare a line from (A0)
  9269.  
  9270. .skcm:                     ;** compare line from (a0)
  9271.  move.l a0,a1              ;use a1,a2
  9272.  move.l a3,a2
  9273. .skcp:
  9274.  tst.b (a2)                ;go if end of patt (matched)
  9275.  beq.s .skcg
  9276.  cmpm.b (a2)+,(a1)+        ;cmp next chr
  9277.  beq .skcp                 ;go unless diff
  9278. .skcg:                     ;EQ if matched
  9279.  rts
  9280.  
  9281. ; TLReqshow Subroutine - get string for seeking
  9282.  
  9283. .rqstr:
  9284.  movem.l d0-d7/a0-a6,-(a7) ;save all
  9285.  move.l a4,xxp_IText(a5)   ;point to buffer for echoing
  9286.  moveq #12,d0              ;make area for input
  9287.  moveq #14,d1
  9288.  move.l #264,d2
  9289.  moveq #19,d3
  9290.  moveq #0,d4
  9291.  move.b xxp_prfp+1(a4),d4
  9292.  bset #29,d0
  9293.  bsr TLReqarea
  9294.  bclr #29,d0
  9295.  bsr TLReqbev
  9296.  lea .prmp2,a0             ;get instructions
  9297.  move.l a4,a1
  9298. .rqtf:
  9299.  move.b (a0)+,(a1)+
  9300.  bne .rqtf
  9301.  move.b xxp_prfp+2(a4),xxp_FrontPen(a5)
  9302.  move.b xxp_prfp+1(a4),xxp_BackPen(a5)
  9303.  moveq #16,d0
  9304.  moveq #16,d1
  9305.  bsr TLText                ;print instructions
  9306.  clr.b (a4)                ;tags &c for TLReqedit
  9307.  addq.l #8,d1
  9308.  sub.w #32,a7
  9309.  move.l a7,a0
  9310.  move.l #xxp_xtext,(a0)+
  9311.  move.l a4,(a0)+
  9312.  move.l #xxp_xmaxt,(a0)+
  9313.  move.l #240,(a0)+
  9314.  move.l #xxp_xmaxc,(a0)+
  9315.  move.l #28,(a0)+
  9316.  clr.l (a0)
  9317.  move.l a7,a0
  9318.  bsr TLWfront
  9319.  jsr TLReqedit
  9320.  add.w #32,a7
  9321.  tst.b (a4)
  9322.  beq.s .rqdn               ;if null input, use old patt
  9323.  move.l a4,a0              ;else, put input into patt
  9324.  move.l a4,a1
  9325.  add.l #xxp_patt,a1
  9326. .rqt2:
  9327.  move.b (a0)+,(a1)+
  9328.  bne .rqt2
  9329. .rqdn:
  9330.  bsr .echo                 ;reshow overlaid lines
  9331.  movem.l (a7)+,d0-d7/a0-a6
  9332.  rts
  9333.  
  9334. ; TLReqshow - smooth redraw for xxp_Hook
  9335.  
  9336. .echo:
  9337.  moveq #11,d1              ;d1 = ypos
  9338.  move.l xxp_tops(a4),d2    ;d2 = linum
  9339.  move.l xxp_totl(a4),d3    ;d3 = total lines
  9340.  move.l xxp_lcom(a4),d4    ;d4 = comp line (if any)
  9341.  move.w xxp_strs+2(a4),d5  ;d5 counts lines
  9342.  subq.w #1,d5
  9343.  
  9344.  move.l xxp_rinf(a4),a3    ;a3 = extent of buff data lines
  9345.  
  9346. .eclc:
  9347.  move.l a4,a1              ;send blank line if past last line
  9348.  cmp.l d3,d2
  9349.  bcc.s .ecev
  9350.  
  9351.  movem.l d1-d6/a3-a5,-(a7) ;get line
  9352.  move.l xxp_Hook(a4),a0
  9353.  move.l d2,d0
  9354.  jsr (a0)
  9355.  movem.l (a7)+,d1-d6/a3-a5
  9356.  
  9357.  move.l a4,a1              ;tfr line to buff
  9358. .ectf:
  9359.  move.b (a0)+,(a1)+
  9360.  bne .ectf
  9361.  
  9362.  subq.l #1,a1              ;blank fill until past rinf
  9363.  move.l a1,d0
  9364.  lsr.w #1,d0
  9365.  bcc.s .ecev
  9366.  move.b #' ',(a1)+
  9367. .ecev:
  9368.  move.l #'    ',(a1)+
  9369.  cmp.l a3,a1
  9370.  bcs .ecev
  9371.  
  9372.  clr.b (a3)                ;chop off to length rinf
  9373.  
  9374.  moveq #2,d0               ;d0 = xpos
  9375.  move.l a4,xxp_IText(a5)   ;point to text
  9376.  move.b xxp_prfp+2(a4),xxp_FrontPen(a5)
  9377.  move.b xxp_prfp(a4),xxp_BackPen(a5)
  9378.  cmp.l d4,d2
  9379.  bne.s .ecpr
  9380.  move.b xxp_prfp+1(a4),xxp_FrontPen(a5)
  9381. .ecpr:
  9382.  bsr TLText                ;print line
  9383.  
  9384.  addq.w #8,d1              ;bump ypos
  9385.  addq.l #1,d2              ;bump linum
  9386.  dbra d5,.eclc
  9387.  rts
  9388.  
  9389. ********************** TLReqshow - Data Section **********************
  9390.  
  9391. .prmp0: dc.b 'Start\End\Quit',0
  9392. .prmp1: dc.b 'Start\End\Seek fore\Seek back\Seek left\Quit',0
  9393. .prmp2: dc.b 'String sought:',0
  9394.  
  9395. .strs: dc.b 0 ;dummy strings for help
  9396.  dc.b 'Use the slider at the right for scanning the strings displayed.',0
  9397.  dc.b 0
  9398.  dc.b 'If appropriate, you can click a line to highlight it, or again',0
  9399.  dc.b 'to remove the highlight. One line at a time can be highlighted.',0
  9400.  dc.b 0
  9401.  dc.b 'The up and down arrows move up and down a step. You can click',0
  9402.  dc.b 'them with the shift key held down to move up/down a window-full.',0
  9403.  dc.b 0
  9404.  dc.b 'You can also press the up/down arrow buttons to move up/down, and',0
  9405.  dc.b 'with shift to move up/down a window-full. If you are looking at',0
  9406.  dc.b 'a very large array of lines, then use the slider for coarse',0
  9407.  dc.b 'positioning, and up/down arrow buttons with shift for fine tuning.',0
  9408.  dc.b 0
  9409.  dc.b 'The Start and End buttons go to start and end as expected. Press',0
  9410.  dc.b 'the Quit button or press Esc to exit from the requester.',0
  9411.  dc.b 0
  9412.  dc.b 'The "Seek fore" & "Seek back" buttons allow you to input a string',0
  9413.  dc.b 'which will be sought fwd or back. If unfound, there will be a',0
  9414.  dc.b 'beep. You can also press "Seek left" which will find the first',0
  9415.  dc.b 'line after the start with the sought string at its left.',0
  9416.  
  9417.  ds.w 0
  9418.  
  9419. *>>>> show data until TLReqoff is called  D0=1st string, D1=no. of strings
  9420. TLData:
  9421.  movem.l d0-d7/a0-a6,-(a7) ;save all except result in d0
  9422.  move.l a7,xxp_Stak(a4)
  9423.  sub.w #xxp_WPort+4,a7     ;create dummy part xxp_wsuw
  9424.  
  9425.  move.l a7,a5
  9426.  bsr TLReqredi             ;set things up
  9427.  beq .bad                  ;bad if can't (unlikely)
  9428.  
  9429.  move.l xxp_pref(a4),a0    ;get pref data
  9430.  move.l xxp_ydat(a0),xxp_prfp(a4)
  9431.  move.l xxp_ydat+4(a0),xxp_prfp+4(a4)
  9432.  
  9433.  move.l xxp_WPort+4(a7),d0 ;find required width of the requester (stack d0)
  9434.  bsr TLStra0               ;point a0 to 1st string
  9435.  move.l xxp_WPort+8(a7),d0 ;get stack d1
  9436.  move.l d0,d3              ;d3 = no. of strings
  9437.  subq.w #1,d0              ;d0 = no. of strings-1
  9438.  moveq #0,d2               ;set d2 to max string width
  9439. .scan:
  9440.  move.l a0,xxp_IText(a5)
  9441.  bsr TLTszdo               ;d4 = size of next string; d6 = height
  9442.  cmp.w d2,d4
  9443.  bcs.s .maxw
  9444.  move.w d4,d2
  9445. .maxw:
  9446.  tst.b (a0)+               ;to next string
  9447.  bne .maxw
  9448.  dbra d0,.scan             ;until all string widths scanned
  9449.  addq.w #8,d2              ;d2 = requester width
  9450.  mulu d6,d3                ;d3 = requester height
  9451.  addq.w #4,d3
  9452.  bsr TLReqchek             ;check size ok
  9453.  beq .bad                  ;bad if not
  9454.  tst.w xxp_ReqNull(a4)     ;go if null
  9455.  beq .null
  9456.  bsr TLReqon               ;requester on
  9457.  beq .bad                  ;bad if can't
  9458.  move.l xxp_WPort+4(a7),d4 ;d4 counts string number
  9459.  move.l xxp_WPort+8(a7),d7 ;d7 counts strings
  9460.  subq.w #1,d7
  9461.  moveq #2,d5               ;d5 = ypos  d6 = string height
  9462.  move.l xxp_AcWind(a4),a5
  9463.  move.b xxp_prfp+1(a4),xxp_FrontPen(a5)
  9464.  move.b xxp_prfp(a4),xxp_BackPen(a5)
  9465. .prnt:
  9466.  move.l d4,d0              ;next string to buff
  9467.  bsr TLStrbuf
  9468.  moveq #4,d0               ;print at 4,d5
  9469.  move.l d5,d1
  9470.  bsr TLText
  9471.  addq.w #1,d4              ;bump string num
  9472.  add.w d6,d5               ;bump ypos
  9473.  move.b xxp_prfp+2(a4),xxp_FrontPen(a5)
  9474.  move.b xxp_prfp(a4),xxp_BackPen(a5)
  9475.  dbra d7,.prnt             ;until all done
  9476.  
  9477. .good:
  9478.  bsr TLHook2
  9479.  
  9480. .null:
  9481.  moveq #-1,d0              ;report success
  9482.  bra.s .done
  9483.  
  9484. .bad:
  9485.  moveq #0,d0
  9486.  
  9487. .done:
  9488.  move.w #-1,xxp_ReqNull(a4)
  9489.  add.w #xxp_WPort+4,a7     ;remove workspace    ***  User must call
  9490.  move.l d0,(a7)            ;result in stack d0  ***  TLReqoff
  9491.  movem.l (a7)+,d0-d7/a0-a6 ;D0=-1 ok, D0=0 bad
  9492.  rts
  9493.  
  9494. *>>>> make a requester window  a5=dummy xxp_wsuw entry,  uses xxp_reqx,y,w,h
  9495. TLReqon:
  9496.  movem.l d0-d7/a0-a4,-(a7) ;save all regs exc a5 (points a5 to WSuite)
  9497.  clr.l xxp_errn(a4)
  9498.  
  9499.  moveq #10,d0              ;open window 10 for requester
  9500.  move.l xxp_reqx(a4),d1
  9501.  move.l xxp_reqy(a4),d2
  9502.  move.l xxp_reqw(a4),d3
  9503.  move.l xxp_reqh(a4),d4
  9504.  move.l d3,d5
  9505.  move.l d4,d6
  9506.  moveq #1,d7               ;usual flags for requester
  9507.  bsr TLWindow              ;open requester window
  9508.  beq.s .bad                ;go if can't
  9509.  
  9510.  move.l a5,a0              ;a0 = dummy xxp_wsuw entry
  9511.  move.l xxp_AcWind(a4),a5  ;point to real xxp_wsuw entry entry
  9512.  move.w xxp_Tspc(a0),xxp_Tspc(a5)
  9513.  moveq #0,d0
  9514.  move.w xxp_Fnum(a0),d0    ;attach dummy Wsuw entry to req window
  9515.  moveq #0,d1
  9516.  move.w xxp_Fsty(a0),d1
  9517.  moveq #0,d2
  9518.  bsr TLNewfont
  9519.  
  9520.  moveq #0,d0               ;draw background & border
  9521.  moveq #0,d1
  9522.  move.l xxp_reqw(a4),d2
  9523.  move.l xxp_reqh(a4),d3
  9524.  moveq #0,d4
  9525.  move.b xxp_prfp(a4),d4    ;background colour from xxp_prfp
  9526.  bset #29,d0
  9527.  bsr TLReqarea
  9528.  bclr #29,d0
  9529.  bsr TLReqbev
  9530.  
  9531.  move.l xxp_hook1(a4),d0   ;call xxp_hook1, if any
  9532.  beq.s .good
  9533.  movem.l a0/a2-a6,-(a7)
  9534.  move.l d0,a0
  9535.  jsr (a0)
  9536.  movem.l (a7)+,a0/a2-a6
  9537.  clr.l xxp_hook1(a4)
  9538.  
  9539. .good:
  9540.  moveq #-1,d0              ;NE if ok
  9541.  bra.s .done
  9542.  
  9543. .bad:
  9544.  addq.l #2,xxp_errn(a4)
  9545.  moveq #0,d0
  9546.  
  9547. .done:
  9548.  movem.l (a7)+,d0-d7/a0-a4 ;EQ, errn<>0 if bad
  9549.  rts
  9550.  
  9551. *>>>> close requester window
  9552. TLReqoff:
  9553.  movem.l d0/a5,-(a7)      ;save all
  9554.  moveq #0,d0
  9555.  move.w xxp_Pop(a4),d0    ;get window to be popped
  9556.  move.l d0,a5
  9557.  moveq #10,d0             ;close requester window
  9558.  bsr TLWsub
  9559.  move.l a5,d0
  9560.  move.w d0,xxp_Active(a4) ;restore xxp_Active
  9561.  bmi.s .quit              ;go if no window was active
  9562.  bsr TLWpop               ;pop formerly active window
  9563. .quit:
  9564.  movem.l (a7)+,d0/a5
  9565.  rts
  9566.  
  9567. *>>>> check that requester size is ok    D2,D3=proposed width,height
  9568. TLReqchek:
  9569.  movem.l d0-d4/a0/a5,-(a7) ;saves all
  9570.  clr.l xxp_errn(a4)
  9571.  moveq #0,d0               ;set d0,d1=left, top
  9572.  moveq #0,d1
  9573.  tst.w xxp_Pop(a4)         ;go if no calling window, when use screen topleft
  9574.  bmi.s .ncur
  9575.  move.l xxp_AcWind(a4),a5  ;posn rel to calling window
  9576.  move.l xxp_Window(a5),a0
  9577.  move.w wd_LeftEdge(a0),d0
  9578.  move.w wd_TopEdge(a0),d1
  9579.  add.w xxp_ReqLeft(a5),d0
  9580.  add.w xxp_ReqTop(a5),d1
  9581. .ncur:
  9582.  move.l xxp_Width(a4),d4   ;check width
  9583.  sub.w d2,d4
  9584.  bcs.s .fixy
  9585.  cmp.w d4,d0
  9586.  bcs.s .hght
  9587.  move.w d4,d0              ;adjust left if required
  9588. .hght:
  9589.  move.l xxp_Height(a4),d4  ;check height
  9590.  sub.w d3,d4
  9591.  bcs.s .fixy
  9592.  cmp.w d4,d1
  9593.  bcs.s .fixh
  9594.  move.w d4,d1              ;adjust height if required
  9595. .fixh:
  9596.  move.l d0,xxp_reqx(a4)
  9597.  move.l d1,xxp_reqy(a4)
  9598.  move.l d2,xxp_reqw(a4)
  9599.  move.l d3,xxp_reqh(a4)
  9600.  move.l xxp_hook0(a4),d0   ;go if xxp_hook0 unset
  9601.  beq.s .hook
  9602.  movem.l d5-d7/a1-a4/a6,-(a7) ;call xxp_hook0
  9603.  move.l d0,a0
  9604.  jsr (a0)
  9605.  movem.l (a7)+,d5-d7/a1-a4/a6
  9606.  clr.l xxp_hook0(a4)
  9607. .hook:
  9608.  moveq #-1,d4
  9609.  movem.l (a7)+,d0-d4/a0/a5
  9610.  rts
  9611. .fixy:
  9612.  move.w #21,xxp_errn+2(a4)   ;if bad, errn=21
  9613.  moveq #0,d4
  9614.  movem.l (a7)+,d0-d4/a0/a5 ;EQ if bad
  9615.  rts
  9616.  
  9617. *>>>> call xxp_hook2 (if applic) when requester drawn
  9618. TLHook2:
  9619.  movem.l d0-d7/a0-a6,-(a7) ;save all
  9620.  move.l xxp_hook2(a4),d0   ;go if no xxp_hook2
  9621.  beq.s .done
  9622.  move.l d0,a0              ;call xxp_hook2
  9623.  jsr (a0)
  9624. .done:
  9625.  movem.l (a7)+,d0-d7/a0-a6
  9626.  clr.l xxp_hook2(a4)
  9627.  rts
  9628.  
  9629. *>>>> print buttons
  9630. TLButprt:
  9631.  movem.l d0-d5,-(a7)       ;saves all
  9632.  move.l xxp_buty(a4),d1    ;d0-d3=TLReqbev data
  9633.  move.l xxp_butw(a4),d2
  9634.  move.l xxp_buth(a4),d3
  9635.  move.l xxp_butl(a4),d5    ;d5 counts rows
  9636.  subq.w #1,d5
  9637. .butr:
  9638.  move.l xxp_butx(a4),d0
  9639.  move.l xxp_butk(a4),d4    ;d4 counts colms
  9640.  subq.w #1,d4
  9641. .butn:
  9642.  bsr TLReqbev
  9643.  add.l xxp_btdx(a4),d0
  9644.  dbra d4,.butn
  9645.  add.l xxp_btdy(a4),d1
  9646.  dbra d5,.butr
  9647.  movem.l (a7)+,d0-d5       ;xxp_errn=0 if drawn ok
  9648.  rts
  9649.  
  9650.  
  9651. *>>>> print txt in requester buttons  a0=string w. \ separators
  9652. ;Caution: uses jam1
  9653. TLButtxt:
  9654.  movem.l d0-d7/a0-a6,-(a7) ;save all regs
  9655.  move.l xxp_AcWind(a4),a5
  9656.  move.l xxp_FrontPen(a5),-(a7)
  9657.  move.l xxp_IText(a5),-(a7)
  9658.  sub.w #84,a7              ;space to tfr strings
  9659.  
  9660.  move.l a7,xxp_IText(a5)
  9661.  
  9662.  move.b #RP_JAM1,xxp_DrawMode(a5) ;use jam1 in case tspc operlaps end of box
  9663.  
  9664.  move.l a7,a2
  9665.  add.w #81,a2              ;a2 = limit of stack string space
  9666.  
  9667.  move.l xxp_buty(a4),d1    ;d1=ypos
  9668.  move.l xxp_butl(a4),d5    ;d5 counts rows
  9669.  subq.w #1,d5
  9670.  
  9671. .butr:                     ;print next row...
  9672.  move.l xxp_butx(a4),d0    ;d0=xpos
  9673.  move.l xxp_butk(a4),d7    ;d7 counts cols
  9674.  subq.w #1,d7
  9675.  
  9676. .butn:                     ;print next button in row...
  9677.  move.l a7,a1
  9678. .str:
  9679.  move.b (a0)+,(a1)+        ;tfr next string to stack
  9680.  beq.s .xdim
  9681.  cmp.b #'\',-1(a1)
  9682.  beq.s .xdmc
  9683.  cmp.l a2,a1
  9684.  bcs .str
  9685.  subq.l #1,a1              ;max len = 80 chrs
  9686.  bra .str
  9687. .xdim:
  9688.  subq.l #1,a0              ;backspace if eos in case not enough strings
  9689. .xdmc:
  9690.  clr.b -(a1)               ;delimit string
  9691.  
  9692.  movem.l d5/d7,-(a7)       ;size string
  9693.  bsr TLTszdo
  9694.  sub.w xxp_Tspc(a5),d4
  9695.  movem.l (a7)+,d5/d7
  9696.  
  9697.  move.l xxp_butw(a4),d2    ;centre text horizontally
  9698.  sub.w d4,d2
  9699.  lsr.w #1,d2
  9700.  add.w d2,d0
  9701.  
  9702.  move.l xxp_buth(a4),d3    ;centre text vertically
  9703.  sub.w d6,d3
  9704.  lsr.w #1,d3
  9705.  add.w d3,d1
  9706.  
  9707.  bsr TLText                ;print text
  9708.  sub.w d2,d0
  9709.  sub.w d3,d1
  9710.  
  9711.  add.l xxp_btdx(a4),d0     ;point to next xpos, do next button
  9712.  dbra d7,.butn
  9713.  
  9714.  add.l xxp_btdy(a4),d1     ;point to next ypos, do next row
  9715.  dbra d5,.butr
  9716.  
  9717.  add.w #84,a7
  9718.  move.l (a7)+,xxp_IText(a5)
  9719.  move.l (a7)+,xxp_FrontPen(a5)
  9720.  movem.l (a7)+,d0-d7/a0-a6
  9721.  rts
  9722.  
  9723. *>>>> set button size & number data  a0=string w. \ separators
  9724. TLButstr:
  9725.  movem.l d0-d7/a0-a6,-(a7) ;saves all regs (IntuitText now at 64(A7))
  9726.  move.l xxp_AcWind(a4),a5
  9727.  move.l xxp_IText(a5),-(a7)
  9728.  sub.w #84,a7              ;buffer to hold strings
  9729.  
  9730.  move.l a7,xxp_IText(a5)
  9731.  move.l a7,a2
  9732.  add.w #81,a2              ;max string len 80 chrs
  9733.  
  9734.  moveq #0,d0               ;d0 holds number
  9735.  moveq #0,d1               ;d1 holds max width
  9736.  
  9737. .butn:                     ;examine next button
  9738.  addq.w #1,d0
  9739.  move.l a7,a1
  9740. .str:
  9741.  move.b (a0)+,(a1)+        ;tfr to buffer
  9742.  beq.s .xsiz
  9743.  cmp.b #'\',-1(a1)
  9744.  beq.s .xsiz
  9745.  cmp.l a2,a1
  9746.  bcs .str
  9747.  subq.l #1,a1              ;max len 80 chrs
  9748.  bra .str
  9749. .xsiz:
  9750.  clr.b -(a1)
  9751.  
  9752.  bsr TLTszdo               ;get text width
  9753.  cmp.w d4,d1
  9754.  bcc.s .xmax
  9755.  move.w d4,d1              ;widest to d1
  9756. .xmax:
  9757.  
  9758.  tst.b -1(a0)              ;until eos
  9759.  bne .butn
  9760.  
  9761.  addq.l #8,d1              ;d1 = button width of widest
  9762.  addq.l #2,d6              ;d6=button height
  9763.  move.l d1,xxp_butw(a4)
  9764.  move.l d6,xxp_buth(a4)
  9765.  move.l d0,xxp_butk(a4)    ;cols = no. of strings } Assumes horizontal row.
  9766.  move.l #1,xxp_butl(a4)    ;rows = 1              } Swap these if vertical.
  9767.  
  9768.  add.w #84,a7
  9769.  move.l (a7)+,xxp_IText(a5)
  9770.  movem.l (a7)+,d0-d7/a0-a6
  9771.  rts
  9772.  
  9773. *>>>> spread horz buttons; sets D2 to required wdth (on call, d0=strng wdth)
  9774. TLButfix:
  9775.  movem.l d0-d1,-(a7)       ;save all exc d2
  9776.  
  9777. .try:
  9778.  move.l (a7),d0            ;d0 = string width
  9779.  moveq #0,d1               ;set d1 = pref horz, butw+d1 in xxp_btdx
  9780.  move.b xxp_prfp+3(a4),d1
  9781.  addq.l #8,d0              ;add 8 to string for edge clearances
  9782.  move.l d1,xxp_butx(a4)    ;butx = 0 or d1+2
  9783.  beq.s .tryc
  9784.  addq.l #2,xxp_butx(a4)    ;if d1<>0, bump also past lhs border
  9785. .tryc:
  9786.  
  9787.  move.l xxp_butw(a4),d2    ;set btdx = D2 = (butw + horz)
  9788.  add.l d1,d2
  9789.  move.l d2,xxp_btdx(a4)
  9790.  
  9791.  mulu xxp_butk+2(a4),d2    ;set D2 = tot width = (butw + horz)*butk + horz
  9792.  add.l d1,d2
  9793.  tst.l d1
  9794.  beq.s .totl
  9795.  addq.l #4,d2              ;if horz<>0, add 4
  9796. .totl:                     ;D2 = total width implied by butw,horz & butk
  9797.  
  9798.  cmp.l d0,d2               ;done if total width >= string width + 8
  9799.  bcc.s .done
  9800.  
  9801.  sub.l d2,d0               ;else, distribute excess (rounded up) to butw
  9802.  add.l xxp_butk(a4),d0
  9803.  subq.l #1,d0
  9804.  divu xxp_butk+2(a4),d0
  9805.  add.w d0,xxp_butw+2(a4)
  9806.  bra .try                  ;& try again
  9807.  
  9808. .done:
  9809.  movem.l (a7)+,d0-d1       ;result in D2
  9810.  rts
  9811.  
  9812. *>>>> set D0=0, or 1+ if mousex,y among buttons (on call D1,d2 = pnter pos)
  9813. TLButmon:
  9814.  movem.l d1-d3/a5,-(a7)    ;save all exc result in d0
  9815.  move.l xxp_AcWind(a4),a5
  9816.  sub.w xxp_LeftEdge(a5),d1
  9817.  sub.w xxp_TopEdge(a5),d2
  9818.  
  9819.  moveq #1,d0               ;d0 counts button num (1+)
  9820.  
  9821.  sub.w xxp_butx+2(a4),d1   ;d1 rel to left of buttons
  9822.  bmi.s .no                 ;go if pointer left of buttons
  9823.  sub.w xxp_buty+2(a4),d2   ;d2 rel to right of buttons
  9824.  bmi.s .no                 ;go if pointer above buttons
  9825.  
  9826.  move.w xxp_butl+2(a4),d3  ;d3 counts rows
  9827.  bra.s .nxrw
  9828.  
  9829. .row:                      ;to next row..
  9830.  add.w xxp_butk+2(a4),d0   ;bump count by number of colms
  9831.  sub.w xxp_btdy+2(a4),d2   ;to next row
  9832.  bmi.s .no                 ;go if above next row
  9833.  
  9834. .nxrw:
  9835.  cmp.w xxp_buth+2(a4),d2   ;go if within this row
  9836.  ble.s .cols
  9837.  dbra d3,.row              ;to next row
  9838.  bra.s .no                 ;no if below last row
  9839.  
  9840. .cols:
  9841.  move.w xxp_butk+2(a4),d3  ;d3 counts colms
  9842.  bra.s .nxcl
  9843.  
  9844. .colm:
  9845.  addq.w #1,d0              ;bump button count
  9846.  sub.w xxp_btdx+2(a4),d1   ;to next column
  9847.  bmi.s .no                 ;go if left of next row
  9848.  
  9849. .nxcl:
  9850.  cmp.w xxp_butw+2(a4),d1   ;yes if within button
  9851.  ble.s .yes
  9852.  dbra d3,.colm             ;no if past last column
  9853.  
  9854. .no:
  9855.  moveq #0,d0
  9856.  
  9857. .yes:
  9858.  tst.l d0                  ;NE if we found a button
  9859.  movem.l (a7)+,d1-d3/a5
  9860.  rts
  9861.  
  9862. *>>>> draw a slider: a5=WSuite
  9863. TLSlider:
  9864.  movem.l d0-d7/a0-a6,-(a7) ;save all
  9865.  move.l a7,xxp_Stak(a4)    ;point to cached caller regs for hook to pick up
  9866.  
  9867.  move.l xxp_slix(a4),d0    ;d0-d3 = area covered
  9868.  move.l xxp_sliy(a4),d1
  9869.  move.l xxp_sliw(a4),d2
  9870.  move.l xxp_slih(a4),d3
  9871.  
  9872.  cmp.w d3,d2               ;go if vertical
  9873.  bmi.s .vert
  9874.  
  9875.  moveq #0,d4               ;clear slide area
  9876.  bset #29,d0
  9877.  sub.w #40,d2
  9878.  bsr TLReqarea
  9879.  bclr #29,d0
  9880.  bsr TLReqbev
  9881.  bset #29,d0
  9882.  add.w d2,d0               ;colour <> boxes
  9883.  moveq #40,d2
  9884.  moveq #3,d4
  9885.  bsr TLReqarea
  9886.  
  9887.  bclr #29,d0               ;draw bevs
  9888.  moveq #20,d2
  9889.  bsr TLReqbev
  9890.  add.w d2,d0
  9891.  bsr TLReqbev
  9892.  
  9893.  move.l d1,d2              ;draw <>
  9894.  move.l d0,d1
  9895.  sub.w #14,d1
  9896.  move.l xxp_slih(a4),d0
  9897.  subq.w #8,d0
  9898.  lsr.w #1,d0
  9899.  add.w d0,d2
  9900.  moveq #7,d0
  9901.  bsr TLPict
  9902.  add.w #20,d1
  9903.  moveq #6,d0
  9904.  bsr TLPict
  9905.  
  9906.  bra.s .done
  9907.  
  9908. .vert:
  9909.  
  9910.  moveq #0,d4               ;clear slide area
  9911.  bset #29,d0
  9912.  sub.w #24,d3
  9913.  bsr TLReqarea
  9914.  bclr #29,d0
  9915.  bsr TLReqbev
  9916.  bset #29,d0
  9917.  add.w d3,d1               ;colour <> boxes
  9918.  moveq #24,d3
  9919.  moveq #3,d4
  9920.  bsr TLReqarea
  9921.  
  9922.  bclr #29,d0               ;draw bevs
  9923.  moveq #12,d3
  9924.  bsr TLReqbev
  9925.  add.w d3,d1
  9926.  bsr TLReqbev
  9927.  
  9928.  move.l d1,d2              ;draw ^v
  9929.  move.l d0,d1
  9930.  sub.w #10,d2
  9931.  move.l xxp_sliw(a4),d0
  9932.  subq.w #8,d0
  9933.  lsr.w #1,d0
  9934.  add.w d0,d1
  9935.  moveq #8,d0
  9936.  bsr TLPict
  9937.  add.w #12,d2
  9938.  moveq #9,d0
  9939.  bsr TLPict
  9940.  
  9941. .done:                     ;xxp_errn=0 if drawn ok
  9942.  
  9943.  bsr TLSlide               ;draw the slide
  9944.  
  9945.  movem.l (a7)+,d0-d7/a0-a6
  9946.  rts
  9947.  
  9948. *>>>> calculate the slide length & position
  9949. TLSlide:
  9950.  movem.l d0-d7,-(a7)       ;save all
  9951.  moveq #0,d5               ;d5 = sense: 0=horz, -1=vert
  9952.  
  9953.  move.l xxp_sliw(a4),d0    ;set d0 = Hg len in pixels
  9954.  cmp.l xxp_slih(a4),d0
  9955.  bcs.s .vert
  9956.  sub.w #44,d0
  9957.  bra.s .both
  9958.  
  9959. .vert:
  9960.  moveq #-1,d5
  9961.  move.l xxp_slih(a4),d0
  9962.  sub.w #26,d0
  9963.  
  9964. .both:
  9965.  bsr TLSlic               ;set d6 = slide, d7=tops  in pixels, validate tops
  9966.  
  9967. .draw:                    ;* draw slide & either side of it
  9968.  tst.w d5
  9969.  bmi.s .dwvt              ;go if vertical
  9970.  
  9971.  move.l d0,d5             ;* draw horz     d5 = totl pixels
  9972.  
  9973.  move.l xxp_slix(a4),d0   ;draw left of slide
  9974.  bset #29,d0
  9975.  addq.w #2,d0
  9976.  move.l xxp_sliy(a4),d1
  9977.  addq.w #1,d1
  9978.  move.l xxp_slih(a4),d3
  9979.  subq.w #2,d3
  9980.  move.l d7,d2
  9981.  beq.s .dwh1              ;(none left if tops=0)
  9982.  moveq #0,d4
  9983.  bsr TLReqarea
  9984.  
  9985. .dwh1:                    ;draw slide
  9986.  add.w d2,d0
  9987.  move.w d6,d2
  9988.  moveq #2,d4
  9989.  bsr TLReqarea
  9990.  
  9991.  add.w d2,d0              ;draw right of slide
  9992.  move.l d5,d2
  9993.  add.l xxp_slix(a4),d2
  9994.  addq.l #2,d2
  9995.  sub.w d0,d2
  9996.  ble.s .hook              ;go if none right
  9997.  moveq #0,d4
  9998.  bsr TLReqarea
  9999.  bra.s .hook
  10000.  
  10001. .dwvt:                    ;* draw vertical slide
  10002.  move.l d0,d5
  10003.  
  10004.  move.l xxp_slix(a4),d0   ;draw above slide
  10005.  bset #29,d0
  10006.  addq.w #2,d0
  10007.  move.l xxp_sliy(a4),d1
  10008.  addq.w #1,d1
  10009.  move.l xxp_sliw(a4),d2
  10010.  subq.w #4,d2
  10011.  move.l d7,d3
  10012.  beq.s .dwv1              ;go if none above
  10013.  moveq #0,d4
  10014.  bsr TLReqarea
  10015.  
  10016. .dwv1:                    ;draw slide
  10017.  add.l d3,d1
  10018.  move.l d6,d3
  10019.  moveq #2,d4
  10020.  bsr TLReqarea
  10021.  
  10022.  add.l d3,d1              ;draw below slide
  10023.  move.l d5,d3
  10024.  add.l xxp_sliy(a4),d3
  10025.  addq.l #1,d3
  10026.  sub.l d1,d3
  10027.  beq.s .hook              ;go if none below
  10028.  moveq #0,d4
  10029.  bsr TLReqarea
  10030.  
  10031. .hook:                    ;call user hook
  10032.  move.l xxp_hook(a4),d0
  10033.  beq.s .done
  10034.  movem.l a0-a6,-(a7)
  10035.  move.l d0,a0
  10036.  jsr (a0)
  10037.  movem.l (a7)+,a0-a6
  10038.  
  10039. .done:
  10040.  movem.l (a7)+,d0-d7
  10041.  rts
  10042.  
  10043. *>>>> calculate slider dimensions
  10044. ; D0 on call = totl in pixels
  10045. ; sets  D6 = slide in pixels
  10046. ;       D7 = tops in pixels   (also validates xxp_tops)
  10047. TLSlic:
  10048.  movem.l d1/d4,-(a7)      ;saves all exc results in D6,D7
  10049.  
  10050. .both:
  10051.  move.l xxp_totl(a4),d1   ;d1 = totl
  10052.  move.l xxp_strs(a4),d6   ;d6 = strs
  10053.  move.l xxp_tops(a4),d7   ;d7 = tops
  10054.  
  10055.  move.l d1,d4             ;* validate tops
  10056.  sub.l d6,d4              ;set d4 = totl - strs - tops
  10057.  sub.l d7,d4
  10058.  bcc.s .scal              ;ok if tops <= totl - strs
  10059.  add.l d7,d4
  10060.  move.l d4,xxp_tops(a4)   ;else, set tops = totl - strs
  10061.  bra .both                ;& reset d1,d6,d7
  10062.  
  10063. .scal:
  10064.  swap d1                  ;scale strs,totl until totl is word length
  10065.  tst.w d1
  10066.  beq.s .scok
  10067.  
  10068. .half:
  10069.  swap d1
  10070.  lsr.l #1,d1
  10071.  lsr.l #1,d6
  10072.  lsr.l #1,d7
  10073.  bra .scal
  10074.  
  10075. .scok:
  10076.  swap d1
  10077.  
  10078.  mulu d0,d6               ;slide size in pixels = strs * pixels / totl
  10079.  divu d1,d6
  10080.  and.l #$0000FFFF,d6      ;remove remainder
  10081.  
  10082.  cmp.w #3,d6
  10083.  bcc.s .tops
  10084.  moveq #3,d6              ;minimum slide size = 3
  10085.  
  10086. .tops:
  10087.  mulu d0,d7               ;tops in pixels = tops * pixels / totl
  10088.  divu d1,d7
  10089.  and.l #$0000FFFF,d7
  10090.  
  10091.  tst.w d4                 ;if tops = totl - strs, tops pixels = 0
  10092.  bne.s .nonz
  10093.  move.l d0,d7
  10094.  sub.l d6,d7
  10095. .nonz:
  10096.  
  10097.  move.w d0,d4             ;tops pixels s/be <= Hg pixels - slide pixels
  10098.  sub.w d6,d4
  10099.  cmp.w d7,d4
  10100.  bcc.s .done
  10101.  move.w d4,d7
  10102.  
  10103. .done:
  10104.  movem.l (a7)+,d1/d4
  10105.  rts
  10106.  
  10107. *>>>> see if click in slider; on call d1-d3=TLKeyboard d0 was $80
  10108. ; returns -1 if in was in slider, else 0
  10109. TLSlimon:
  10110.  movem.l d0-d7/a0-a6,-(a7) ;save all except result in d0
  10111.  move.l a7,xxp_Stak(a4)    ;point xxp_Stak to cached regs for hook to use
  10112.  move.l xxp_AcWind(a4),a5
  10113.  
  10114.  sub.w xxp_LeftEdge(a5),d1 ;make d1,d2 rel to slider
  10115.  sub.w xxp_slix+2(a4),d1
  10116.  bmi .no                   ;go if clicked outside slider
  10117.  cmp.w xxp_sliw+2(a4),d1
  10118.  bgt .no
  10119.  sub.w xxp_TopEdge(a5),d2
  10120.  sub.w xxp_sliy+2(a4),d2
  10121.  bmi .no
  10122.  cmp.w xxp_slih+2(a4),d2
  10123.  bgt .no
  10124.  
  10125.  moveq #0,d4               ;d4 = -1 if recycling
  10126.  
  10127. .rcyc:
  10128.  move.l xxp_sliw(a4),d0    ;go if vert
  10129.  cmp.l xxp_slih(a4),d0
  10130.  bcs.s .vert
  10131.  
  10132.  tst.w d4
  10133.  bne.s .hrzf
  10134.  sub.w #20,d0              ;horz..
  10135.  cmp.w d0,d1
  10136.  bcc .more                 ;go if >
  10137.  sub.w #20,d0
  10138.  cmp.w d0,d1               ;go if <
  10139.  bcc .less
  10140. .hrzf:
  10141.  subq.w #2,d1
  10142.  bcc.s .hrzc
  10143.  moveq #0,d1
  10144. .hrzc:
  10145.  subq.w #4,d0              ;d0 = totl in pixels
  10146.  bra.s .both
  10147.  
  10148. .vert:
  10149.  move.l xxp_slih(a4),d0
  10150.  move.l d2,d1
  10151.  tst.w d4
  10152.  bne.s .vrtf
  10153.  sub.w #12,d0              ;vert..
  10154.  cmp.w d0,d1
  10155.  bcc .more                 ;go if v
  10156.  sub.w #12,d0
  10157.  cmp.w d0,d1               ;go if ^
  10158.  bcc .less
  10159. .vrtf:
  10160.  subq.w #1,d1
  10161.  bcc.s .vrtc
  10162.  moveq #0,d1
  10163. .vrtc:
  10164.  subq.w #2,d0              ;d0 = totl in pixels
  10165.  
  10166. .both:
  10167.  bsr TLSlic                ;sets d6=slide, d7=tops  in pixels
  10168.  
  10169.  tst.w d4                  ;go if rcyc
  10170.  bne.s .slim
  10171.  cmp.w d7,d1
  10172.  bcs .lpag                 ;if left/above slide, back a page
  10173.  add.w d6,d7
  10174.  cmp.w d7,d1
  10175.  bgt .mpag                 ;if right/below slide, forward a page
  10176.  sub.w d6,d7
  10177.  
  10178. .slim:                     ;pointer is on slide (d0=totl,d1=pntr)
  10179.  moveq #0,d2
  10180.  move.l xxp_totl(a4),d3
  10181.  
  10182. .scal:                     ;scale total down d2 steps to make word size
  10183.  swap d3
  10184.  tst.w d3
  10185.  beq.s .scok
  10186.  addq.w #1,d2
  10187.  swap d3
  10188.  lsr.l #1,d3
  10189.  bra .scal
  10190. .scok:
  10191.  swap d3
  10192.  
  10193.  mulu d3,d1                ;make d1 to be in terms of totl
  10194.  divu d0,d1
  10195.  and.l #$0000FFFF,d1
  10196.  bra.s .unsf
  10197.  
  10198. .unsc:                     ;scale d1 up d2 steps
  10199.  lsl.l #1,d1
  10200. .unsf:
  10201.  dbra d2,.unsc
  10202.  
  10203.  move.l xxp_strs(a4),d2    ;sutbract strs/2 from d1 to make ptr half up slid
  10204.  lsr.l #1,d2
  10205.  sub.l d2,d1
  10206.  bcc.s .scld
  10207.  moveq #0,d1
  10208.  
  10209. .scld:
  10210.  move.l d1,xxp_tops(a4)    ;set tops to new value
  10211.  bsr TLSlide               ;go validate tops, draw slide there
  10212.  
  10213.  move.l xxp_gfxb(a4),a6    ;avoid busy wait
  10214.  jsr _LVOWaitTOF(a6)
  10215.  move.l xxp_Window(a5),a1  ;get window structure
  10216.  bsr TLMmess               ;any messages?
  10217.  
  10218.  beq.s .none               ;no, keep going
  10219.  
  10220.  bra .yes                  ;yes, quit (assume mouse up)
  10221.  
  10222. .none:
  10223.  moveq #-1,d4              ;make d1,d2 rel to slider area
  10224.  move.l xxp_Window(a5),a1
  10225.  moveq #0,d1
  10226.  moveq #0,d2
  10227.  move.w wd_MouseX(a1),d1
  10228.  move.w wd_MouseY(a1),d2
  10229.  
  10230.  move.l xxp_sliw(a4),d0
  10231.  cmp.l xxp_slih(a4),d0
  10232.  bcs.s .nnc1
  10233.  
  10234.  sub.w xxp_LeftEdge(a5),d1
  10235.  sub.w xxp_slix+2(a4),d1
  10236.  subq.w #2,d1
  10237.  bpl.s .nnc0
  10238.  moveq #0,d1
  10239. .nnc0:
  10240.  sub.w #44,d0
  10241.  cmp.w d1,d0
  10242.  bcc.s .nnc3
  10243.  move.w d0,d1
  10244.  bra.s .nnc3
  10245.  
  10246. .nnc1:
  10247.  move.l xxp_slih(a4),d0
  10248.  move.l d2,d1
  10249.  sub.w xxp_TopEdge(a5),d1
  10250.  sub.w xxp_sliy+2(a4),d1
  10251.  subq.w #1,d1
  10252.  bpl.s .nnc2
  10253.  moveq #0,d1
  10254. .nnc2:
  10255.  sub.w #26,d0
  10256.  cmp.w d1,d0
  10257.  bcc .nnc3
  10258.  move.w d0,d1
  10259.  
  10260. .nnc3:
  10261.  bsr TLSlic
  10262.  bra .slim
  10263.  
  10264. .lpag:
  10265.  move.l xxp_strs(a4),d0
  10266.  bra.s .lesc
  10267. .less:
  10268.  moveq #1,d0
  10269. .lesc:
  10270.  sub.l d0,xxp_tops(a4)
  10271.  bcc.s .udlr
  10272.  clr.l xxp_tops(a4)
  10273.  bra.s .udlr
  10274.  
  10275. .mpag:
  10276.  move.l xxp_strs(a4),d0
  10277.  bra.s .morc
  10278. .more:
  10279.  moveq #1,d0
  10280. .morc:
  10281.  add.l d0,xxp_tops(a4)
  10282.  
  10283. .udlr:
  10284.  bsr TLSlide
  10285.  
  10286. .yes:
  10287.  moveq #-1,d0              ;signal yes we were
  10288.  bra.s .quit
  10289.  
  10290. .no:
  10291.  moveq #0,d0               ;signal no we weren't
  10292.  
  10293. .quit:
  10294.  move.l d0,(a7)            ;result to d0 in stack
  10295.  movem.l (a7)+,d0-d7/a0-a6
  10296.  rts
  10297.  
  10298. *>>>> wait for any windw to be active, pop it (IDCMP_ACTIVEWINDOW discarded)
  10299. TLWpoll:
  10300.  movem.l a0-a6,-(a7)    ;save all except D0-D3
  10301. .poll:
  10302.  moveq #0,d5            ;d5=wnum
  10303.  move.l xxp_WSuite(a4),a5 ;a5=suite pointer
  10304. .next:
  10305.  move.l xxp_Window(a5),d0 ;go if no window
  10306.  beq.s .skip
  10307.  move.l d0,a1           ;any message? (if yes, presumably Active Window)
  10308.  bsr TLMmess
  10309.  bne.s .actv            ;yes, go
  10310. .skip:
  10311.  add.l #xxp_siz2,a5     ;to next window
  10312.  addq.w #1,d5
  10313.  cmp.w #10,d5           ;until all looked at
  10314.  bne .next
  10315.  move.l xxp_gfxb(a4),a6
  10316.  jsr _LVOWaitTOF(a6)    ;pause to avoid busy wait
  10317.  bra .poll              ;poll the windows again
  10318. .actv:
  10319.  move.l d0,a0           ;save d0
  10320.  move.l d5,d0
  10321.  bsr TLWpop             ;pop the window
  10322.  move.l a0,d0           ;restore d0
  10323.  movem.l (a7)+,a0-a6    ;D5=window num; TLMmess in D0-D4
  10324.  rts
  10325.  
  10326. *>>>> clear all messages waiting at all windows
  10327. TLWslof:
  10328.  movem.l d0-d7/a0-a6,-(a7) ;save all
  10329.  move.l xxp_gfxb(a4),a6    ;pause for messages to arrive
  10330.  jsr _LVOWaitTOF(a6)
  10331.  jsr _LVOWaitTOF(a6)
  10332. .scan:
  10333.  move.l xxp_WSuite(a4),a5 ;a5 scans WSuite
  10334.  moveq #9,d7              ;d7 counts windows
  10335. .next:
  10336.  move.l xxp_Window(a5),d0 ;get next window
  10337.  beq.s .slof              ;go if none
  10338.  move.l d0,a1
  10339.  bsr TLMmess              ;get messages waiting none at any window
  10340.  bne .scan
  10341. .slof:
  10342.  add.l #xxp_siz2,a5       ;to next until all done
  10343.  dbra d7,.next
  10344.  movem.l (a7)+,d0-d7/a0-a6
  10345.  rts
  10346.  
  10347. *>>>> make sure current is at front
  10348. TLWfront:
  10349.  movem.l d0-d1/a0-a1/a5-a6,-(a7) ;save all
  10350.  move.l xxp_intb(a4),a6
  10351.  move.l xxp_AcWind(a4),a5
  10352.  move.l xxp_Window(a5),a0
  10353.  jsr _LVOWindowToFront(a6)
  10354.  movem.l (a7)+,d0-d1/a0-a1/a5-a6
  10355.  rts
  10356.  
  10357. *>>>> put current at back
  10358. TLWback:
  10359.  movem.l d0-d1/a0-a1/a5-a6,-(a7) ;save all
  10360.  move.l xxp_intb(a4),a6
  10361.  move.l xxp_AcWind(a4),a5
  10362.  move.l xxp_Window(a5),a0
  10363.  jsr _LVOWindowToBack(a6)
  10364.  movem.l (a7)+,d0-d1/a0-a1/a5-a6
  10365.  rts
  10366.  
  10367. *>>>> create a help requester if xxp_Help set (called ONLY by TLKeyboard)
  10368.  
  10369. ; help 1st str, num strs in xxp_Help(a4),xxp_Help+2(a4)
  10370. ; if no help, xxp_Help(a4) = 0
  10371. ; if bit 31 of xxp_Help(a4) set, forbidden (to prevent recursive calls)
  10372.  
  10373. TLHelp:
  10374.  tst.l xxp_Screen(a4)      ;no help if all unitialised
  10375.  beq .quit
  10376.  tst.w xxp_Public(a4)
  10377.  ble .quit
  10378.  tst.w xxp_Active(a4)      ;no help if no window active
  10379.  bmi .quit
  10380.  tst.l xxp_Help(a4)        ;go if no help, or help forbidden
  10381.  ble .quit
  10382.  
  10383.  move.l xxp_butx(a4),-(a7) ;save button data
  10384.  move.l xxp_buty(a4),-(a7)
  10385.  move.l xxp_butw(a4),-(a7)
  10386.  move.l xxp_buth(a4),-(a7)
  10387.  move.l xxp_btdx(a4),-(a7)
  10388.  move.l xxp_btdy(a4),-(a7)
  10389.  move.l xxp_butk(a4),-(a7)
  10390.  move.l xxp_butl(a4),-(a7)
  10391.  
  10392.  movem.l d0-d7/a0-a6,-(a7) ;save all
  10393.  
  10394.  move.w xxp_Pop(a4),d0     ;save pop
  10395.  move.l d0,-(a7)
  10396.  move.l (a4),-(a7)         ;leave buff unchanged
  10397.  move.l 4(a4),-(a7)
  10398.  move.l 8(a4),-(a7)
  10399.  
  10400.  move.l a4,a0              ;save reqx to butl
  10401.  add.w #xxp_reqx,a0
  10402.  moveq #11,d0
  10403. .save:
  10404.  move.l (a0)+,-(a7)
  10405.  dbra d0,.save
  10406.  
  10407.  sub.w #xxp_WPort+4,a7     ;create dummy part xxp_wsuw
  10408.  
  10409.  move.l a7,a5              ;set all part_wsuw data
  10410.  move.w xxp_Active(a4),xxp_Pop(a4)
  10411.  move.w #$0103,xxp_FrontPen(a5)
  10412.  move.b #RP_JAM2,xxp_DrawMode(a5)
  10413.  clr.l xxp_LeftEdge(a5)
  10414.  move.l xxp_AcWind(a4),a1
  10415.  move.w xxp_HTspc(a1),xxp_Tspc(a5)
  10416.  move.w xxp_HFsty(a1),xxp_Fsty(a5)
  10417.  move.w xxp_HFont(a1),xxp_Fnum(a5)
  10418.  move.w #-1,xxp_Attc(a5)
  10419.  move.l a4,xxp_IText(a5)
  10420.  move.l xxp_ERport(a4),xxp_WPort(a5)  ;use xxp_ERport as dummy xxp_WPort
  10421.  
  10422. .rcyc:                     ;* set size of requester
  10423.  move.l a4,a0              ;set minimum xxp_butw,xxp_buth
  10424.  move.w #'OK',(a0)
  10425.  clr.b 2(a0)               ;OK if no guide
  10426.  tst.w xxp_Help+2(a4)
  10427.  bpl.s .buts
  10428.  move.l #'Guid',(a0)       ;else Guide\OK
  10429.  move.l #'e\OK',4(a0)
  10430.  clr.b 8(a0)
  10431. .buts:
  10432.  move.l xxp_AcWind(a4),-(a7)
  10433.  move.l a5,xxp_AcWind(a4)
  10434.  bsr TLButstr
  10435.  move.l (a7)+,xxp_AcWind(a4)
  10436.  
  10437.  move.w xxp_Help(a4),d0    ;point a3 to strings
  10438.  bsr TLStra0
  10439.  move.l a0,a3              ;a0 scans strings
  10440.  move.w xxp_Help+2(a4),d1  ;d1 counts strings
  10441.  bclr #15,d1
  10442.  subq.w #1,d1
  10443.  moveq #0,d3               ;set d3 to max string width
  10444. .maxw:
  10445.  move.l a0,xxp_IText(a5)
  10446.  bsr TLTszdo
  10447. .maxc:
  10448.  tst.b (a0)+
  10449.  bne .maxc
  10450.  cmp.w d4,d3
  10451.  bcc.s .maxx
  10452.  move.w d4,d3
  10453. .maxx:
  10454.  dbra d1,.maxw
  10455.  
  10456.  addq.w #8,d3              ;d3 = max string width + 8 = req width for strs
  10457.  move.w xxp_butw+2(a4),d2  ;d2 = req width for buts
  10458.  addq.w #2,d2              ; (6 ea side + 2 between)
  10459.  mulu xxp_butk+2(a4),d2
  10460.  add.w #10,d2
  10461.  cmp.w d3,d2
  10462.  bcc.s .butf
  10463.  move.w d3,d2              ;d2 = required req width
  10464.  
  10465. .butf:                     ;complete the data for buts
  10466.  move.l d2,d0
  10467.  sub.w #12,d0
  10468.  move.w d0,xxp_butw+2(a4)  ;if 1 button, butw = width - 12
  10469.  cmp.w #1,xxp_butk+2(a4)
  10470.  beq.s .buth
  10471.  subq.w #2,d0
  10472.  lsr.w #1,d0
  10473.  move.w d0,xxp_butw+2(a4)  ;else, = (width - 14)/2
  10474.  addq.w #2,d0
  10475.  move.l d0,xxp_btdx(a4)    ;& btdx = butw + 2
  10476. .buth:
  10477.  move.l #6,xxp_butx(a4)    ;butx = 6
  10478.  
  10479.  move.w xxp_Help+2(a4),d3  ;calulate req height
  10480.  bclr #15,d3
  10481.  mulu d6,d3                ;= strs * str ht
  10482.  addq.w #3,d3              ;+ 2 at top, 1 below text
  10483.  move.l d3,xxp_buty(a4)    ;set buty
  10484.  add.l xxp_buth(a4),d3     ;+ buth
  10485.  addq.l #2,d3              ;+ 2 at bot
  10486.  
  10487.  cmp.l xxp_Width(a4),d2    ;go if requester not too wide
  10488.  ble.s .gtht
  10489.  tst.w xxp_Tspc(a5)        ;retry w. Tspc-1 if Tspc<>0
  10490.  beq.s .wdt2
  10491.  subq.w #1,xxp_Tspc(a5)
  10492.  bra .rcyc
  10493. .wdt2:
  10494.  tst.w xxp_Fnum(a5)        ;retry w. Fnum=0 if Fnum<>0
  10495.  beq.s .gtht               ;(else, will be too big to fit)
  10496. .fon0:
  10497.  moveq #0,d0               ;attach font 0 to dummy xxp_wsuw
  10498.  moveq #0,d1               ;(will be passed on by TLReqon)
  10499.  moveq #0,d2
  10500.  bsr TLAnyfont
  10501.  bne .rcyc
  10502.  
  10503. .gtht:
  10504.  cmp.l xxp_Height(a4),d3   ;go if requester not too high
  10505.  ble.s .chek
  10506.  tst.w xxp_Fnum(a5)        ;redo with Fnum=0 if Fnum<>0
  10507.  bne .fon0                 ;(else will be too big)
  10508.  
  10509. .chek:
  10510.  bsr TLReqchek             ;check req dims, &c
  10511.  beq .wrap                 ;go if won't fit
  10512.  
  10513.  moveq #11,d0              ;open window 11 for requester
  10514.  move.l xxp_reqx(a4),d1
  10515.  move.l xxp_reqy(a4),d2
  10516.  move.l xxp_reqw(a4),d3
  10517.  move.l xxp_reqh(a4),d4
  10518.  move.l d3,d5
  10519.  move.l d6,a2              ;(save d6)
  10520.  move.l d4,d6
  10521.  moveq #1,d7               ;usual flags for requester
  10522.  bsr TLWindow              ;open requester window
  10523.  beq .wrap                 ;go if can't
  10524.  move.l a2,d6              ;(restore d6)
  10525.  
  10526.  move.l a5,a0              ;a0 = dummy xxp_wsuw entry
  10527.  move.l xxp_AcWind(a4),a5  ;point to real xxp_wsuw entry entry
  10528.  move.w xxp_Tspc(a0),xxp_Tspc(a5)
  10529.  moveq #0,d0
  10530.  move.w xxp_Fnum(a0),d0    ;attach dummy wsuw font to req window
  10531.  moveq #0,d1
  10532.  move.w xxp_Fsty(a0),d1
  10533.  moveq #0,d2
  10534.  bsr TLNewfont
  10535.  
  10536.  moveq #0,d0               ;draw background & border
  10537.  moveq #0,d1
  10538.  move.l xxp_reqw(a4),d2
  10539.  move.l xxp_reqh(a4),d3
  10540.  moveq #3,d4
  10541.  bset #29,d0
  10542.  bsr TLReqarea
  10543.  bclr #29,d0
  10544.  bsr TLReqbev
  10545.  
  10546.  move.w #$0103,xxp_FrontPen(a5)
  10547.  
  10548.  bsr TLButprt              ;draw buttons & text therein
  10549.  move.l a4,a0
  10550.  move.w #'OK',(a0)
  10551.  clr.b 2(a0)
  10552.  tst.w xxp_Help+2(a4)
  10553.  bpl.s .btts
  10554.  move.l #'Guid',(a0)
  10555.  move.l #'e\OK',4(a0)
  10556.  clr.b 8(a0)
  10557. .btts:
  10558.  bsr TLButtxt
  10559.  
  10560.  move.w #$0203,xxp_FrontPen(a5) ;draw strings
  10561.  moveq #4,d0
  10562.  moveq #2,d1
  10563.  move.w xxp_Help+2(a4),d2
  10564.  bclr #15,d2
  10565.  subq.w #1,d2
  10566. .prnt:
  10567.  move.l a3,xxp_IText(a5)
  10568.  bsr TLText
  10569.  move.b #1,xxp_FrontPen(a5)
  10570.  add.w d6,d1
  10571. .pfwd:
  10572.  tst.b (a3)+
  10573.  bne .pfwd
  10574.  dbra d2,.prnt
  10575.  
  10576.  bset #7,xxp_Help(a4)      ;disable recursive help calls
  10577.  
  10578. .wait:
  10579.  bsr TLWfront              ;get keyboard
  10580.  bsr TLKeyboard
  10581.  
  10582.  tst.b xxp_Help+2(a4)      ;go if OK only
  10583.  bpl.s .ngui
  10584.  
  10585.  cmp.b #$0D,d0             ;to guide if Enter,F1
  10586.  beq.s .guid
  10587.  cmp.b #$81,d0
  10588.  beq.s .guid
  10589.  cmp.b #$82,d0             ;quit if F2
  10590.  beq.s .clos
  10591.  btst #6,d3
  10592.  beq.s .ngui               ;go unless Left Amiga
  10593.  cmp.b #'b',d0
  10594.  beq.s .clos               ;LfAm / b -> OK
  10595.  cmp.b #'v',d0
  10596.  beq.s .guid               ;LfAm / v -> guide
  10597.  
  10598. .ngui:
  10599.  cmp.b #$0D,d0             ;quit if Enter (& 1 button)
  10600.  beq.s .clos
  10601.  cmp.b #$81,d0             ;quit if F1 (& 1 button)
  10602.  beq.s .clos
  10603.  cmp.b #$1B,d0             ;quit if Esc
  10604.  beq.s .clos
  10605.  
  10606.  cmp.b #$80,d0             ;else accept only lmb
  10607.  bne .wait
  10608.  
  10609.  bsr TLButmon              ;monitor buttons
  10610.  beq .wait                 ;go if none
  10611.  cmp.b #2,d0
  10612.  beq.s .clos               ;quit if 2nd button
  10613.  tst.b xxp_Help+2(a4)
  10614.  bpl.s .clos               ;quit if 1st button, & 1 button
  10615.  
  10616. .guid:                     ;here if guide
  10617.  bsr TLGuide
  10618.  bra .wait
  10619.  
  10620. .clos:
  10621.  moveq #0,d0
  10622.  move.w xxp_Pop(a4),d0    ;get window to be popped
  10623.  move.l d0,a5
  10624.  moveq #11,d0             ;close requester window
  10625.  bsr TLWsub
  10626.  move.l a5,d0
  10627.  move.w d0,xxp_Active(a4) ;restore xxp_Active
  10628.  bsr TLWpop               ;pop formerly active window
  10629.  
  10630.  bclr #7,xxp_Help(a4)      ;re-enable help
  10631.  
  10632. .wrap:
  10633.  add.w #xxp_WPort+4,a7
  10634.  
  10635.  move.l a4,a0              ;restore reqx to butl
  10636.  add.w #xxp_butl+4,a0
  10637.  moveq #11,d0
  10638. .load:
  10639.  move.l (a7)+,-(a0)
  10640.  dbra d0,.load
  10641.  
  10642.  move.l (a7)+,8(a4)        ;restore buff (left unchanged)
  10643.  move.l (a7)+,4(a4)
  10644.  move.l (a7)+,(a4)
  10645.  move.l (a7)+,d0           ;restore pop
  10646.  move.w d0,xxp_Pop(a4)
  10647.  
  10648.  movem.l (a7)+,d0-d7/a0-a6
  10649.  
  10650.  move.l (a7)+,xxp_butl(a4) ;restore button data
  10651.  move.l (a7)+,xxp_butk(a4)
  10652.  move.l (a7)+,xxp_btdy(a4)
  10653.  move.l (a7)+,xxp_btdx(a4)
  10654.  move.l (a7)+,xxp_buth(a4)
  10655.  move.l (a7)+,xxp_butw(a4)
  10656.  move.l (a7)+,xxp_buty(a4)
  10657.  move.l (a7)+,xxp_butx(a4)
  10658.  
  10659. .quit:
  10660.  rts
  10661.  
  10662. *>>>> View Multiline.guide (called by TLHelp,TLMultiline)
  10663.  
  10664. ; Set xxp_guid,xxp_path & set bit 7 of xxp_Help+2 to put Guide\OK on help.
  10665.  
  10666. TLGuide:
  10667.  
  10668. ; offsets to xxp_gide workspace
  10669. .lock: equ 1008            ;lock on CD
  10670. .aggb: equ 1016            ;amigaguide.library base
  10671. .hndl: equ 1012            ;amigaguide handle
  10672. .name: equ 100             ;CD name (max 130 bytes)
  10673.  
  10674.  movem.l d0-d7/a0-a6,-(a7) ;save all
  10675.  move.l xxp_gide(a4),a5    ;a5 = 1024 byte workspace
  10676.  
  10677.  move.l xxp_dosb(a4),a6    ;lock CD
  10678.  move.l a5,d1
  10679.  add.l #.name,d1
  10680.  move.l #130,d2
  10681.  jsr _LVOGetCurrentDirName(a6)
  10682.  move.l a5,d1
  10683.  add.l #.name,d1
  10684.  moveq #ACCESS_READ,d2
  10685.  jsr _LVOLock(a6)
  10686.  move.l d0,.lock(a5)
  10687.  beq .gubd                 ;bad if can't
  10688.  
  10689.  move.l xxp_sysb(a4),a6    ;open amigaguide.library
  10690.  lea .s136,a1
  10691.  moveq #37,d0
  10692.  jsr _LVOOpenLibrary(a6)
  10693.  move.l d0,.aggb(a5)
  10694.  beq.s .gubd               ;bad if can't
  10695.  
  10696.  move.l .aggb(a5),a6       ;make a NewAmigaGuide structure
  10697.  move.l a5,a0
  10698.  move.w #NewAmigaGuide_SIZEOF-1,d0
  10699. .gung:
  10700.  clr.b (a0)+               ;clear the structure
  10701.  dbra d0,.gung
  10702.  move.l a7,a0              ;a0 points to it
  10703.  move.l xxp_guid(a4),nag_Name(a0)
  10704.  move.l xxp_node(a4),nag_Node(a0)
  10705.  move.l .lock(a5),nag_Lock(a0)
  10706.  move.l xxp_Screen(a4),nag_Screen(a0)
  10707.  
  10708.  sub.l a1,a1               ;open the amigaguide
  10709.  moveq #0,d0
  10710.  jsr _LVOOpenAmigaGuideA(A6)
  10711.  move.l d0,.hndl(a5)       ;cache handle
  10712.  bne.s .guok               ;go if open
  10713.  
  10714.  move.l xxp_intb(a4),a6    ;beep if can't
  10715.  move.l xxp_Screen(a4),a0
  10716.  jsr _LVODisplayBeep(a6)
  10717.  bra.s .gub0
  10718.  
  10719. .guok:
  10720.  move.l .aggb(a5),a6       ;close the amigaguide
  10721.  move.l .hndl(a5),a0
  10722.  jsr _LVOCloseAmigaGuide(a6)
  10723. .gub0:
  10724.  
  10725.  move.l xxp_sysb(a4),a6    ;close amigaguide.library
  10726.  move.l .aggb(a5),a1
  10727.  jsr _LVOCloseLibrary(a6)
  10728.  
  10729. .guqt:                     ;unlock CD
  10730.  move.l xxp_dosb(a4),a6
  10731.  move.l .lock(a5),d1
  10732.  jsr _LVOUnLock(a6)
  10733.  bra.s .gufn
  10734.  
  10735. .gubd:                     ;here if bad (beep)
  10736.  move.l xxp_intb(a4),a6
  10737.  move.l xxp_Screen(a4),a0
  10738.  jsr _LVODisplayBeep(a6)
  10739.  
  10740. .gufn:
  10741.  movem.l (a7)+,d0-d7/a0-a6
  10742.  rts
  10743.  
  10744. .s136: dc.b 'amigaguide.library',0
  10745.  ds.w 0
  10746.  
  10747. *>>>> same as TLText, but quits if window resized, trims to fit (slower)
  10748.  
  10749. ; quits with error if window resized
  10750. ; if won't fit horizontally, trims to fit  (no error)
  10751. ; if won't fit vertically, doensn't print  (no error)
  10752.  
  10753. TLTrim:
  10754.  movem.l d0-d7/a0-a6,-(a7) ;save all regs
  10755.  move.l a4,a3
  10756. .eol:
  10757.  tst.b (a3)+               ;point a3 to end of string
  10758.  bne .eol
  10759.  subq.l #1,a3
  10760.  move.b (a3),d3            ;d3 = chr where trimmed
  10761.  clr.l xxp_errn(a4)
  10762.  move.l xxp_gfxb(a4),a6
  10763.  move.l xxp_AcWind(a4),a5
  10764.  move.l xxp_WPort(a5),a1
  10765.  move.w xxp_Tspc(a5),rp_TxSpacing(a1)
  10766. .try:
  10767.  move.l (a7),d0            ;set d0,d1 for next try
  10768.  move.l 4(a7),d1
  10769.  bsr TLTszdo               ;attach font if required, text size data to d4-d7
  10770.  add.w xxp_xmin(a5),d0
  10771.  sub.w xxp_xmin(a5),d4     ;adjust lhs, remaining width for underflow
  10772.  add d1,d6
  10773.  cmp.w xxp_PHeight(a5),d6  ;quit if window too shallow
  10774.  bgt.s .done
  10775.  add.w d0,d4
  10776.  cmp.w xxp_PWidth(a5),d4   ;go print if window wide enough
  10777.  ble.s .cont
  10778.  cmp.l a3,a4               ;quit if no chrs will fit
  10779.  beq.s .done
  10780.  move.b d3,(a3)            ;restore prvious trim chr
  10781.  subq.l #1,a3              ;one less chr
  10782.  move.b (a3),d3            ;keep trim chr
  10783.  clr.b (a3)                ;trim it
  10784.  bra .try                  ;& try again
  10785. .cont:
  10786.  bsr TLWpens               ;attach pens if required
  10787.  add.w xxp_LeftEdge(a5),d0 ;make d0,d1 rel to edges of window rastport
  10788.  add.w xxp_TopEdge(a5),d1
  10789.  add.w d7,d1               ;make d1 point to baseline
  10790.  jsr _LVOMove(a6)          ;print posn on rastport
  10791.  move.l d5,d0              ;d0 = no. of chrs
  10792.  move.l a4,a0              ;a0 points to text
  10793.  move.l xxp_WPort(a5),a1   ;a1 = rastport
  10794.  bsr TLWCheck              ;bad if window resized
  10795.  bne.s .bad
  10796.  jsr _LVOText(a6)          ;print
  10797.  bra.s .done
  10798.  
  10799. .bad:                      ;bad: window resized
  10800.  move.w #35,xxp_errn+2(a4)
  10801.  
  10802. .done:
  10803.  move.b d3,(a3)            ;un-trim the text
  10804.  movem.l (a7)+,d0-d7/a0-a6
  10805.  tst.l xxp_errn(a4)
  10806.  eori.w #-1,CCR            ;xxp_errn<>0, EQ if bad
  10807.  rts
  10808.  
  10809. *>>>> close window D0 in the suite (can call if already closed)
  10810. TLWsub:
  10811.  movem.l d0-d2/a0-a2/a5-a6,-(a7) ;save all regs
  10812.  
  10813.  cmp.w xxp_Active(a4),d0   ;update xxp_Active if affected
  10814.  bne.s .pass
  10815.  move.w #-1,xxp_Active(a4)
  10816. .pass:
  10817.  
  10818.  move.l xxp_WSuite(a4),a5  ;point to WSuite entry
  10819.  mulu #xxp_siz2,d0
  10820.  add.l d0,a5
  10821.  tst.l xxp_Window(a5)      ;go if already closed
  10822.  beq .done
  10823.  
  10824.  move.l xxp_Mmem(a5),d0    ;close Multiline mem if any
  10825.  beq.s .muon
  10826.  move.l xxp_sysb(a4),a6
  10827.  move.l d0,a1
  10828.  jsr _LVOFreeVec(a6)
  10829.  
  10830. .muon:
  10831.  move.l xxp_intb(a4),a6    ;detach menu if attached
  10832.  tst.l xxp_Menu(a5)
  10833.  beq.s .clos
  10834.  tst.w xxp_Menuon(a5)
  10835.  beq.s .clos
  10836.  move.l xxp_Window(a5),a0
  10837.  jsr _LVOClearMenuStrip(a6)
  10838. .clos:
  10839.  move.l xxp_Window(a5),a1
  10840.  movem.l d0-d4,-(a7)
  10841.  bsr TLMmess
  10842.  movem.l (a7)+,d0-d4
  10843.  bne .clos
  10844.  
  10845.  move.l xxp_Window(a5),a0  ;close window
  10846.  jsr _LVOCloseWindow(a6)
  10847.  clr.l xxp_Window(a5)      ;flag as closed
  10848.  move.l xxp_Menu(a5),d0    ;free xxp_Menu (if any)
  10849.  beq.s .wrap
  10850.  move.l xxp_gadb(a4),a6
  10851.  move.l d0,a0
  10852.  jsr _LVOFreeMenus(a6)
  10853. .wrap:
  10854.  
  10855.  move.l xxp_scrl(a5),d0    ;go if no scrollers
  10856.  beq.s .done
  10857.  move.l d0,a2
  10858.  moveq #5,d2
  10859.  move.l xxp_intb(a4),a6
  10860. .frob:                     ;free scroller objects
  10861.  move.l (a2)+,a0
  10862.  jsr _LVODisposeObject(a6)
  10863.  dbra d2,.frob
  10864.  move.l xxp_scrl(a5),a2    ;free context gadget
  10865.  move.l xxp_gcnt(a2),a0
  10866.  clr.l gg_NextGadget(a0)
  10867.  move.l xxp_gadb(a4),a6
  10868.  jsr _LVOFreeGadgets(a6)
  10869.  
  10870. .done:
  10871.  movem.l (a7)+,d0-d2/a0-a2/a5-a6
  10872.  rts
  10873.  
  10874. *>>>> put suite window D0 in xxPram, bring it to front & activate it
  10875. ; ok to call if window D0 already popped
  10876. ; (calls TLWslof to stop churning)
  10877. TLWpop:
  10878.  movem.l d0-d1/a0-a1/a5-a6,-(a7) ;save all regs
  10879.  move.w d0,xxp_Active(a4)    ;note new pop
  10880.  move.l xxp_WSuite(a4),a5    ;point to new window
  10881.  mulu #xxp_siz2,d0
  10882.  add.l d0,a5
  10883.  move.l a5,xxp_AcWind(a4)    ;update xxp_AcWind
  10884.  bsr TLWfront
  10885.  move.l xxp_WPort(a5),a0     ;get rastport
  10886.  move.l xxp_Window(a5),a0    ;activate popped window
  10887.  move.l xxp_intb(a4),a6
  10888.  jsr _LVOActivateWindow(a6)
  10889.  bsr TLWslof                 ;slough all idcmp's
  10890.  movem.l (a7)+,d0-d1/a0-a1/a5-a6
  10891.  rts
  10892.  
  10893. *>>>> transform ASCII at (a0) into a 68881-type .P in (a1)
  10894.  
  10895. ; return code d0: 0=ok 1=no digits in mantissa 2=bad exp 3=no digits after E
  10896. ; 3(a1)=0 on return if zero
  10897.  
  10898. TLFloat:
  10899.  movem.l d4-d7/a2,-(a7) ;save all exc d0, a0 bypasses
  10900.  clr.l (a1)         ;initialise output
  10901.  clr.l 4(a1)
  10902.  clr.l 8(a1)
  10903.  cmp.b #'+',(a0)
  10904.  beq.s .sign
  10905.  cmp.b #'-',(a0)
  10906.  bne.s .plus
  10907.  bset #7,(a1)       ;bit 95=1 if -ve
  10908. .sign:
  10909.  addq.l #1,a0       ;bypass sign if any
  10910. .plus:
  10911.  move.l a0,a2       ;a2 tests that mantissa exists
  10912.  addq.l #1,a2
  10913.  moveq #0,d7        ;d7 counts power
  10914.  moveq #'.',d6      ;d6=.   for finding .
  10915.  moveq #'0',d5      ;d5='0' for conv ascii to hex/bcd
  10916.  moveq #10,d4       ;d4=10  for conv ascii to hex/bcd
  10917. .lead:
  10918.  cmp.b (a0)+,d5     ;skip leading zeroes
  10919.  beq .lead
  10920.  cmp.b -1(a0),d6    ;leading .?
  10921.  bne.s .some        ;no, start scanning mantissa
  10922.  addq.l #1,a2       ;allow for . in a2
  10923. .point:
  10924.  subq.w #1,d7       ;exp=-1 if leading . plus no. of further leading 0's
  10925.  cmp.b (a0)+,d5
  10926.  beq .point
  10927. .some:
  10928.  move.b -1(a0),d0   ;get first non-0 digit
  10929.  sub.b d5,d0        ;if none, then zero
  10930.  bcs.s .zero
  10931.  cmp.b d4,d0
  10932.  bcs.s .mant        ;go if 1-9 (1st digit of mantissa)
  10933. .zero:
  10934.  cmp.l a0,a2        ;bad if no mantissa
  10935.  beq .bad1
  10936.  cmp.b #'E'-'0',d0  ;here if zero: if has exp, slough it
  10937.  beq.s .zeroe
  10938.  cmp.b #'e'-'0',d0
  10939.  bne.s .zeroq
  10940. .zeroe:
  10941.  move.b (a0),d0
  10942.  cmp.b #'+',d0
  10943.  beq.s .zeros
  10944.  cmp.b #'-',d0
  10945.  bne.s .zerox
  10946. .zeros:
  10947.  addq.l #1,a0
  10948. .zerox:
  10949.  move.b (a0)+,d0
  10950.  sub.b d5,d0
  10951.  bcs.s .zeroq
  10952.  cmp.b d4,d0
  10953.  bcs .zerox
  10954. .zeroq:
  10955.  subq.l #1,a0       ;point to delimiter
  10956.  clr.b (a1)         ;make zero
  10957.  moveq #0,d0        ;flag ok
  10958.  movem.l (a7)+,d4-d7/a2
  10959.  rts
  10960. .mant:
  10961.  move.l a1,a2       ;a2 puts digits
  10962.  addq.l #3,a2
  10963.  move.b d0,(a2)+    ;put 1st chr of mantissa
  10964.  moveq #7,d1        ;d1 counts mantissa bytes (8 bytes=16 digits)
  10965.  tst.w d7
  10966.  bne.s .ptgt        ;go if . already found
  10967. .digt:              ;get digits in pairs into (a2)
  10968.  move.b (a0)+,d0    ;frst digit
  10969.  sub.b d5,d0
  10970.  bcs.s .ptgt1       ;if <'0', see if . (frst)
  10971.  cmp.b d4,d0
  10972.  bcc.s .exp         ;if >'0', see if E/e
  10973.  lsl.b #4,d0
  10974.  move.b d0,(a2)     ;put in ms nybble
  10975.  addq.w #1,d7       ;bump exp for each digit before .
  10976.  move.b (a0)+,d0    ;scnd digit
  10977.  sub.b d5,d0
  10978.  bcs.s .ptgt2       ;if <'0', see if . (scnd)
  10979.  cmp.b d4,d0
  10980.  bcc.s .exp         ;if >'0', see if E/e
  10981.  or.b d0,(a2)+      ;or into ls nybble
  10982.  addq.w #1,d7       ;bump exp for each digit before .
  10983.  dbra d1,.digt
  10984.  subq.w #1,d7       ;if 17 digits already, slough further
  10985. .noslof:
  10986.  addq.w #1,d7       ;bump exp for each sloughed digit
  10987.  move.b (a0)+,d0
  10988.  sub.b d5,d0
  10989.  bcs .calc          ;no E/e if <'0'
  10990.  cmp.b d4,d0
  10991.  bcs .noslof
  10992.  bra.s .exp         ;if >'0', try E/e
  10993. .ptgt2:
  10994.  cmp.b #'.'-'0',d0  ;if . pick up . digits in 2nd digt
  10995.  beq.s .ptp
  10996.  bra .calc          ;else, no E/e
  10997. .ptgt1:
  10998.  cmp.b #'.'-'0',d0  ;if . pick up . digits in 1st digt
  10999.  bne .calc          ;else, no E/e
  11000. .ptgt:              ;get digits after . in pairs
  11001.  move.b (a0)+,d0    ;frst digit
  11002.  sub.b d5,d0
  11003.  bcs .calc          ;if <'0', no E/e
  11004.  cmp.b d4,d0
  11005.  bcc.s .exp         ;if >'0', try E/e
  11006.  lsl.b #4,d0
  11007.  move.b d0,(a2)     ;put ms nybble
  11008. .ptp:
  11009.  move.b (a0)+,d0    ;scnd digit
  11010.  sub.b d5,d0
  11011.  bcs.s .calc        ;if <'0', no E/e
  11012.  cmp.b d4,d0
  11013.  bcc.s .exp         ;if >'0', try E/e
  11014.  or.b d0,(a2)+      ;put ls bybble
  11015.  dbra d1,.ptgt
  11016. .slof:              ;slough digits after 17th
  11017.  move.b (a0)+,d0
  11018.  sub.b d5,d0
  11019.  bcs.s .calc        ;no E/e if <'0'
  11020.  cmp.b d4,d0
  11021.  bcs .slof          ;if >'0', try E/e
  11022. .exp:
  11023.  cmp.b #'E'-'0',d0  ;seek exp if E/e
  11024.  beq.s .expg
  11025.  cmp.b #'e'-'0',d0
  11026.  bne.s .calc
  11027. .expg:
  11028.  moveq #0,d6        ;d6 will be <> if Ennn exp -ve
  11029.  cmp.b #'+',(a0)
  11030.  beq.s .jump
  11031.  cmp.b #'-',(a0)
  11032.  bne.s .expr
  11033.  moveq #-1,d6       ;d6=-1 if nnn -ve
  11034. .jump:
  11035.  addq.l #1,a0
  11036. .expr:
  11037.  moveq #0,d1
  11038.  move.b (a0)+,d1    ;frst n to d1
  11039.  sub.b d5,d1
  11040.  bcs .bad3          ;bad if none
  11041.  cmp.b d4,d1
  11042.  bcc .bad3
  11043.  moveq #0,d0        ;scnd digit
  11044.  move.b (a0)+,d0
  11045.  sub.b d5,d0
  11046.  bcs.s .calcr       ;go if none
  11047.  cmp.b d4,d0
  11048.  bcc.s .calcr
  11049.  mulu #10,d1        ;else into d1
  11050.  add.w d0,d1
  11051.  move.b (a0)+,d0    ;thrd digit
  11052.  sub.b d5,d0
  11053.  bcs.s .calcr       ;go if none
  11054.  cmp.b d4,d0
  11055.  bcc.s .calcr
  11056.  mulu #10,d1        ;else into d1
  11057.  add.w d0,d1
  11058.  move.b (a0)+,d0    ;get delimiter
  11059.  sub.b d5,d0
  11060.  bcs.s .calcr
  11061.  cmp.b d4,d0
  11062.  bcc .bad2          ;bad if 0-9 (exp overflow)
  11063. .calcr:
  11064.  tst.w d6           ;add E+nnn to, or sub E-nnn from, mantissa exp
  11065.  bpl.s .plmi
  11066.  sub.w d1,d7
  11067.  bra.s .calcc
  11068. .plmi:
  11069.  add.w d1,d7
  11070. .calc:
  11071.  tst.w d7           ;see if exp +ve
  11072. .calcc:
  11073.  bpl.s .calcp       ;yes, go
  11074.  bset #6,(a1)       ;no, set bit 94
  11075.  neg.w d7           ;& make exp +ve
  11076. .calcp:
  11077.  divu #100,d7       ;get hundreds
  11078.  cmp.b #10,d7
  11079.  beq .bad2          ;(bad of exp>999)
  11080.  or.b d7,(a1)       ;put 1st nybble to bits 88+
  11081.  clr.w d7
  11082.  swap d7            ;get mod 100
  11083.  divu #10,d7        ;get tens
  11084.  rol.w #4,d7
  11085.  move.b d7,1(a1)    ;put 2nd nybble to bits 84+
  11086.  swap d7            ;get units
  11087.  or.b d7,1(a1)      ;put 3rd nybble to bits 80+
  11088.  subq.l #1,a0       ;point to delimiter
  11089.  moveq #0,d0        ;D0=0 good
  11090.  movem.l (a7)+,d4-d7/a2
  11091.  rts
  11092. .bad1:              ;D0=1 no digits in mantissa
  11093.  moveq #1,d0
  11094.  movem.l (a7)+,d4-d7/a2
  11095.  rts
  11096. .bad2:              ;D0=2 exponent out of range
  11097.  moveq #2,d0
  11098.  movem.l (a7)+,d4-d7/a2
  11099.  rts
  11100. .bad3:              ;D0=3 no digits after E
  11101.  moveq #3,d0
  11102.  movem.l (a7)+,d4-d7/a2
  11103.  rts
  11104.  
  11105. *>>>> put busy pointer in current TL window (call Busysetup first)
  11106. TLBusy:
  11107.  movem.l d0-d3/a0-a1/a5-a6,-(a7) ;save all
  11108.  move.l xxp_intb(a4),a6
  11109.  move.l xxp_AcWind(a4),a5
  11110.  move.l xxp_Window(a5),a0 ;get window
  11111.  cmp.w #39,LIB_VERSION(a6)
  11112.  bcc.s .v39               ;use v.39 method if available
  11113.  move.l xxp_busy(a4),d0
  11114.  beq.s .quit              ;go if Busysetup failed
  11115.  move.l d0,a1             ;a1 points to sprite data
  11116.  moveq #16,d0             ;width,height,hotpoint
  11117.  moveq #16,d1
  11118.  moveq #0,d2
  11119.  moveq #0,d3
  11120.  jsr _LVOSetPointer(a6)   ;change pointer
  11121.  bra.s .quit
  11122. .v39:                     ;here if 3.0+ (v.39+)
  11123.  lea .tags,a1
  11124.  jsr _LVOSetWindowPointerA(a6)
  11125. .quit:
  11126.  movem.l (a7)+,d0-d3/a0-a1/a5-a6
  11127.  rts
  11128.  
  11129. .tags:                    ;tags for busy pointer (v39+ method)
  11130.  dc.l WA_BusyPointer,1    ;this uses the prefs busy pointer
  11131.  dc.l WA_PointerDelay,1   ;this stops the change if the delay is very short
  11132.  dc.l TAG_DONE
  11133.  
  11134. *>>>> return window pointer to un-busy (ok to call if TLBusy never called)
  11135. ; doesn't matter if window closed without calling this first
  11136. TLUnbusy:
  11137.  movem.l d0-d1/a0-a1/a5-a6,-(a7) ;save all
  11138.  move.l xxp_intb(a4),a6
  11139.  move.l xxp_AcWind(a4),a5
  11140.  move.l xxp_Window(a5),a0 ;get window
  11141.  cmp.w #39,LIB_VERSION(a6)
  11142.  bcc.s .v39               ;go if v39+ (3.0+)
  11143.  jsr _LVOClearPointer(a6) ;restore pointer
  11144.  bra.s .quit
  11145. .v39:
  11146.  lea .tags,a1
  11147.  jsr _LVOSetWindowPointerA(a6)
  11148. .quit:
  11149.  movem.l (a7)+,d0-d1/a0-a1/a5-a6
  11150.  rts
  11151.  
  11152. .tags:
  11153.    dc.l  WA_Pointer,0    ;tag for normal pointer
  11154.    dc.l  TAG_DONE
  11155.  
  11156.  
  11157. *>>>> put up a color requester (bad if <OS3.0)
  11158.  
  11159. ; D0 on call:  0 = pen select only
  11160. ;              1 = pen select + palette enabled
  11161. ;              2 = palette only
  11162. ;             -1 = load prefs palette, don't put up requester
  11163.  
  11164. ; (if D0=-1, can call if xxp_Screen(a4) exists, but TLWindow never called)
  11165.  
  11166. TLReqcolor:
  11167.  tst.l d0                 ;go put up requester if required
  11168.  bpl .requ
  11169.  
  11170. ; TLReqcolor - here if no requester required (D0 = -1)
  11171.  
  11172.  movem.l d0-d7/a0-a6,-(a7) ;save all
  11173.  
  11174.  move.l xxp_sysb(a4),a6
  11175.  move.l #3084,d0           ;= 4 + 12*256 + 4
  11176.  moveq #MEMF_PUBLIC,d1
  11177.  jsr _LVOAllocVec(a6)
  11178.  tst.l d0
  11179.  beq.s .subd
  11180.  move.l d0,a3              ;a3 = mem for rgb values
  11181.  
  11182.  move.w #256,(a3)          ;init rgb mem
  11183.  clr.w 2(a3)
  11184.  clr.l 3076(a3)
  11185.  
  11186.  move.l a4,a0              ;read ENV:Tandem/Color (if exists)
  11187.  move.l #'ENV:',(a0)+
  11188.  move.l #'Tand',(a0)+
  11189.  move.l #'em/C',(a0)+
  11190.  move.l #'olor',(a0)+
  11191.  clr.b (a0)
  11192.  bsr TLOpenread
  11193.  beq.s .suok
  11194.  move.l a3,d2
  11195.  addq.l #4,d2
  11196.  move.l #3072,d3
  11197.  bsr TLReadfile
  11198.  beq.s .suok
  11199.  bsr TLClosefile
  11200.  
  11201.  move.l xxp_gfxb(a4),a6    ;set colours as read
  11202.  move.l xxp_Screen(a4),a0
  11203.  add.l #sc_ViewPort,a0
  11204.  move.l a3,a1
  11205.  jsr _LVOLoadRGB32(a6)
  11206.  
  11207. .suok:
  11208.  move.l a3,a1              ;release rgb mem
  11209.  move.l xxp_sysb(a4),a6
  11210.  jsr _LVOFreeVec(a6)
  11211.  
  11212. .subd:
  11213.  movem.l (a7)+,d0-d7/a0-a6
  11214.  rts
  11215.  
  11216. ; TLReqcolor - here if requester required (D0 = 0/1/2)
  11217.  
  11218. .requ:
  11219.  move.l xxp_Help(a4),-(a7)
  11220.  move.l xxp_strg(a4),-(a7)
  11221.  
  11222.  move.l xxp_butx(a4),-(a7) ;save button data
  11223.  move.l xxp_buty(a4),-(a7)
  11224.  move.l xxp_butw(a4),-(a7)
  11225.  move.l xxp_buth(a4),-(a7)
  11226.  move.l xxp_btdx(a4),-(a7)
  11227.  move.l xxp_btdy(a4),-(a7)
  11228.  move.l xxp_butk(a4),-(a7)
  11229.  move.l xxp_butl(a4),-(a7)
  11230.  
  11231.  move.l xxp_slix(a4),-(a7) ;save slider data
  11232.  move.l xxp_sliy(a4),-(a7)
  11233.  move.l xxp_sliw(a4),-(a7)
  11234.  move.l xxp_slih(a4),-(a7)
  11235.  move.l xxp_tops(a4),-(a7)
  11236.  move.l xxp_totl(a4),-(a7)
  11237.  move.l xxp_strs(a4),-(a7)
  11238.  move.l xxp_hook(a4),-(a7)
  11239.  
  11240.  movem.l d1-d7/a0-a6,-(a7) ;save all regs except D0
  11241.  clr.l xxp_errn(a4)
  11242.  move.l d0,xxp_butl(a4)    ;(save input d0 here)
  11243.  sub.w #xxp_WPort+4,a7     ;create dummy part xxp_wsuw
  11244.  
  11245.  move.l xxp_sysb(a4),a6
  11246.  cmp.w #39,LIB_VERSION(a6) ;bad if not OS3.0+
  11247.  bcs .v39
  11248.  
  11249.  move.l #6156,d0           ;= 2*(256*4*3+4)+4 (3 longwords/color; max 256)
  11250.  moveq #MEMF_PUBLIC,d1
  11251.  jsr _LVOAllocVec(a6)
  11252.  tst.l d0
  11253.  beq .oom
  11254.  move.l d0,a3              ;a3 = mem for rgb values
  11255.  
  11256.  move.l a7,a5              ;a5 points to dummy part xxp_wsuw
  11257.  bsr TLReqredi             ;set pop window
  11258.  beq .bad                  ;(go if init fails - unlikely)
  11259.  
  11260.  move.l xxp_Depth(a4),d4   ;colour buttons: set d6=rows,d7=clms
  11261.  lea .tabl,a0
  11262.  lsl.w #1,d4
  11263.  moveq #0,d6
  11264.  moveq #0,d7
  11265.  move.b 0(a0,d4.w),d6
  11266.  move.b 1(a0,d4.w),d7
  11267.  
  11268.  move.l #292,d2            ;set req size
  11269.  move.l #156,d3
  11270.  bsr TLReqchek             ;check requester size &c
  11271.  beq .bad
  11272.  
  11273.  tst.w xxp_ReqNull(a4)     ;go if null
  11274.  beq .null
  11275.  
  11276.  bsr TLReqon               ;window on
  11277.  beq .bad                  ;go if can't
  11278.  
  11279.  move.l xxp_gfxb(a4),a6    ;get existing colormap info
  11280.  move.l xxp_Screen(a4),a1
  11281.  add.l #sc_ViewPort,a1
  11282.  move.l vp_ColorMap(a1),a0
  11283.  moveq #1,d1
  11284.  move.l xxp_Depth(a4),d0
  11285.  rol.l d0,d1               ;d1=no. of colors
  11286.  moveq #0,d0
  11287.  move.l a3,a1
  11288.  move.w d1,(a1)+           ;put in LoadRGB32 format
  11289.  clr.w (a1)+
  11290.  jsr _LVOGetRGB32(a6)
  11291.  move.l a3,a0
  11292.  move.l a3,a1
  11293.  add.l #3076,a1            ;put in 2nd half in case cancel
  11294.  move.w (a3),d0            ;put guns
  11295.  mulu #3,d0                ;cols*3+1 longwords
  11296.  
  11297. .bkup:
  11298.  move.l (a0)+,(a1)+        ;put in canc data
  11299.  dbra d0,.bkup
  11300.  clr.l (a1)                ;delimit canc data
  11301.  
  11302.  move.l xxp_AcWind(a4),a5  ;a5=WSuite
  11303.  clr.w xxp_Tspc(a5)        ;Reqcolor always uses Topaz/8 plain spc0
  11304.  moveq #0,d0
  11305.  moveq #0,d1
  11306.  moveq #0,d2
  11307.  bsr TLNewfont
  11308.  
  11309.  move.l #.strs,xxp_strg(a4)
  11310.  move.l xxp_butl(a4),d0    ;set help for whichever task
  11311.  mulu #18,d0
  11312.  addq.l #1,d0
  11313.  move.w d0,xxp_Help(a4)
  11314.  move.w #18,xxp_Help+2(a4)
  11315.  
  11316. .rcyc:                     ;* redraw requester
  11317.  bsr .clir
  11318.  
  11319.  moveq #55,d0              ;print hail
  11320.  cmp.l #2,xxp_butl(a4)
  11321.  bne.s .st55
  11322.  moveq #56,d0
  11323. .st55:
  11324.  bsr TLStrbuf
  11325.  moveq #4,d0
  11326.  moveq #2,d1
  11327.  move.w #$0203,xxp_FrontPen(a5)
  11328.  bsr TLText
  11329.  
  11330.  moveq #0,d0               ;bev around colors
  11331.  moveq #11,d1
  11332.  move.l #292,d2
  11333.  moveq #90,d3
  11334.  bsr TLReqbev
  11335.  
  11336.  move.l #2,xxp_butx(a4)    ;set button sizes
  11337.  move.l #12,xxp_buty(a4)
  11338.  move.l #288,d0
  11339.  divu d7,d0
  11340.  move.l d0,xxp_butw(a4)
  11341.  move.l d0,xxp_btdx(a4)
  11342.  moveq #88,d0
  11343.  divu d6,d0
  11344.  move.l d0,xxp_buth(a4)
  11345.  clr.l xxp_btdy(a4)
  11346.  
  11347.  move.l d6,-(a7)           ;fill each button with its pen color
  11348.  subq.w #1,d6
  11349.  move.l xxp_buty(a4),d1
  11350.  move.l xxp_butw(a4),d2
  11351.  move.l xxp_buth(a4),d3
  11352.  moveq #0,d4
  11353. .row:
  11354.  move.l xxp_butx(a4),d0
  11355.  move.l d7,d5
  11356.  subq.w #1,d5
  11357. .colm:
  11358.  bset #29,d0
  11359.  bsr TLReqarea
  11360.  bclr #29,d0
  11361.  addq.w #1,d4
  11362.  add.l xxp_btdx(a4),d0
  11363.  dbra d5,.colm
  11364.  add.l xxp_buth(a4),d1
  11365.  dbra d6,.row
  11366.  move.l (a7)+,d6
  11367.  
  11368.  move.l #256,xxp_totl(a4)  ;ready to draw sliders
  11369.  move.l #1,xxp_strs(a4)
  11370.  moveq #0,d0
  11371.  moveq #101,d1
  11372.  moveq #40,d2
  11373.  moveq #11,d3
  11374.  bsr TLReqbev
  11375.  move.l #40,xxp_slix(a4)
  11376.  move.l #252,xxp_sliw(a4)
  11377.  move.l d3,xxp_slih(a4)
  11378.  moveq #112,d1
  11379.  bsr TLReqbev
  11380.  moveq #123,d1
  11381.  bsr TLReqbev
  11382.  
  11383.  moveq #0,d0               ;draw use/cancel buttons
  11384.  move.l #134,d1
  11385.  moveq #56,d2
  11386.  moveq #11,d3
  11387.  bsr TLReqbev
  11388.  move.l #236,d0
  11389.  bsr TLReqbev
  11390.  move.w #$0103,xxp_FrontPen(a5)
  11391.  moveq #4,d0
  11392.  addq.w #2,d1
  11393.  move.l #'Choo',(a4)
  11394.  move.w #'se',4(a4)
  11395.  clr.b 6(a4)
  11396.  bsr TLText
  11397.  move.l #'Canc',(a4)
  11398.  move.w #'el',4(a4)
  11399.  move.l #240,d0
  11400.  bsr TLText
  11401.  
  11402.  moveq #0,d0               ;draw ld/sv buttons
  11403.  move.l #145,d1
  11404.  moveq #56,d2
  11405.  moveq #11,d3
  11406.  bsr TLReqbev
  11407.  move.l #236,d0
  11408.  bsr TLReqbev
  11409.  moveq #12,d0
  11410.  addq.w #2,d1
  11411.  move.l #'Save',(a4)
  11412.  clr.b 4(a4)
  11413.  bsr TLText
  11414.  move.l #'Load',(a4)
  11415.  move.l #248,d0
  11416.  bsr TLText
  11417.  
  11418.  moveq #56,d0             ;box around chosen pen
  11419.  move.l #134,d1
  11420.  move.l #180,d2
  11421.  moveq #22,d3
  11422.  bsr TLReqbev
  11423.  
  11424.  moveq #0,d4              ;intial pen
  11425.  
  11426. .colr:
  11427.  moveq #58,d0             ;* fill bot area with pen d4
  11428.  move.l #135,d1
  11429.  move.l #176,d2
  11430.  moveq #20,d3
  11431.  bset #29,d0
  11432.  bsr TLReqarea
  11433.  
  11434.  move.l d4,d0             ;initialise sliders for this pen
  11435.  mulu #12,d0
  11436.  clr.l 58(a4)             ;(d5=0 for hook)
  11437.  move.l #101,xxp_sliy(a4)
  11438.  move.l a3,50(a4)         ;(a3 data for hook)
  11439.  move.l d4,54(a4)         ;(d4 data for hook)
  11440.  move.l #.hook,xxp_hook(a4)
  11441.  clr.l xxp_tops(a4)
  11442.  move.b 4(a3,d0.w),xxp_tops+3(a4)
  11443.  bsr TLSlider
  11444.  addq.l #1,58(a4)         ;(d5=1 for hook)
  11445.  move.l #112,xxp_sliy(a4)
  11446.  clr.l xxp_tops(a4)
  11447.  move.b 8(a3,d0.w),xxp_tops+3(a4)
  11448.  bsr TLSlider
  11449.  addq.l #1,58(a4)          ;(d5=2 for hook)
  11450.  move.l #123,xxp_sliy(a4)
  11451.  clr.l xxp_tops(a4)
  11452.  move.b 12(a3,d0.w),xxp_tops+3(a4)
  11453.  bsr TLSlider
  11454.  
  11455. .wait:                     ;* wait for response
  11456.  bsr TLWfront
  11457.  bsr TLKeyboard
  11458.  
  11459.  cmp.b #$1B,d0
  11460.  beq .canc                 ;cancel if Esc
  11461.  cmp.b #$0D,d0
  11462.  beq .choo                 ;choose if Return
  11463.  cmp.b #$80,d0
  11464.  bne .wait                 ;go if not click
  11465.  cmp.w #145,d2             ;go if not load/save
  11466.  bcs.s .ucol
  11467.  cmp.w #56,d1              ;go if save button
  11468.  bcs .sav
  11469.  
  11470.  cmp.w #236,d1             ;go if load button, else keep waiting
  11471.  bcs .wait
  11472.  tst.l xxp_butl(a4)
  11473.  beq .bpdo                 ;go beep if choose only
  11474.  bsr .load
  11475.  bra .rcyc                 ;else load & redraw window
  11476.  
  11477. .ucol:
  11478.  cmp.w #134,d2
  11479.  bcs.s .ccol               ;go if not bot buts
  11480.  cmp.w #56,d1
  11481.  bcs .choo                 ;go if choose button
  11482.  cmp.w #236,d1
  11483.  bcc .canc                 ;go if cancel button
  11484.  bra .wait                 ;else keep waiting
  11485.  
  11486. .ccol:
  11487.  cmp.w #11,d2              ;go if pens not clicked
  11488.  bcs .wait
  11489.  cmp.w #101,d2
  11490.  bcc .csli
  11491.  sub.w #11,d2              ;d2 rel to pens box
  11492.  divu xxp_buth+2(a4),d2    ;d2=row num
  11493.  cmp.w d6,d2               ;go if > num of rows
  11494.  bcc .wait
  11495.  mulu d7,d2                ;get clms*rownum
  11496.  subq.w #2,d1
  11497.  bcs .wait                 ;d1 rel to pens box
  11498.  divu xxp_butw+2(a4),d1    ;d1=clm num
  11499.  cmp.w d7,d1
  11500.  bcc .wait                 ;go if > num of clms
  11501.  add.w d1,d2               ;d2=pen num
  11502.  move.w d2,d4              ;d4=pen num
  11503.  bra .colr                 ;go put this pen at bottom
  11504.  
  11505. .csli:
  11506.  move.l d4,d0              ;d0 ready to point to color
  11507.  mulu #12,d0
  11508.  cmp.w #40,d1              ;here if slides area
  11509.  bcs .wait                 ;go if left of slides
  11510.  cmp.w #134,d2
  11511.  bcc .wait                 ;go if below slides
  11512.  
  11513.  tst.l xxp_butl(a4)        ;beep if palette forbidden
  11514.  beq .bpdo
  11515.  
  11516.  cmp.w #112,d2
  11517.  bcs.s .csl0               ;bra to whichever slider
  11518.  cmp.w #123,d2
  11519.  bcs.s .csl1
  11520.  bra.s .csl2
  11521.  
  11522. .csl0:
  11523.  clr.l 58(a4)              ;d5=0/1/2 for r/g/b
  11524.  move.l #101,xxp_sliy(a4)  ;put sliy for slider
  11525.  clr.l xxp_tops(a4)
  11526.  move.b 4(a3,d0.l),xxp_tops+3(a4) ;initialise tops
  11527.  bra.s .cslc
  11528.  
  11529. .csl1:
  11530.  move.l #1,58(a4)
  11531.  move.l #112,xxp_sliy(a4)
  11532.  clr.l xxp_tops(a4)
  11533.  move.b 8(a3,d0.l),xxp_tops+3(a4)
  11534.  bra.s .cslc
  11535.  
  11536. .csl2:
  11537.  move.l #2,58(a4)
  11538.  move.l #123,xxp_sliy(a4)
  11539.  clr.l xxp_tops(a4)
  11540.  move.b 12(a3,d0.l),xxp_tops+3(a4)
  11541.  
  11542. .cslc:
  11543.  move.l #.hook,xxp_hook(a4) ;set hook
  11544.  bsr TLSlimon              ;update r/g/b
  11545.  bra .wait                 ;& recyc
  11546.  
  11547. .sav:                      ;* save selected
  11548.  tst.l xxp_butl(a4)
  11549.  beq.s .bpdo               ;go if choose only
  11550.  
  11551.  bsr .pref
  11552.  cmp.w #1,d0
  11553.  bgt .rcyc
  11554.  beq.s .use
  11555.  
  11556.  moveq #-1,d0              ;save to ENV:, ENVARC:
  11557.  bra.s .usep
  11558.  
  11559. .use:                      ;save to ENV:
  11560.  moveq #0,d0
  11561.  
  11562. .usep:
  11563.  bsr .save                 ;save prefs
  11564.  cmp.l #2,xxp_butl(a4)
  11565.  beq.s .close              ;quit if save only
  11566.  bra .rcyc                 ;else redraw & continue
  11567.  
  11568. .choo:                     ;* chose chosen
  11569.  cmp.l #2,xxp_butl(a4)
  11570.  bne.s .close              ;go unless palette only
  11571.  
  11572. .bpdo:                     ;beep & keep waiting
  11573.  bsr .beep
  11574.  bra .wait
  11575.  
  11576. .canc:                     ;* cancel chosen
  11577.  tst.l xxp_butl(a4)        ;(colors ok if D0 was 0)
  11578.  beq.s .cncp
  11579.  
  11580.  move.l xxp_gfxb(a4),a6    ;restore colors to at start
  11581.  move.l xxp_Screen(a4),a0
  11582.  add.l #sc_ViewPort,a0
  11583.  move.l a3,a1
  11584.  add.l #3076,a1
  11585.  jsr _LVOLoadRGB32(a6)
  11586.  
  11587. .cncp:
  11588.  moveq #-1,d4              ;xxp_errn = 0 if cancel
  11589.  
  11590. .close:
  11591.  bsr TLReqoff              ;close requester window, pop old window if any
  11592.  bra.s .done
  11593.  
  11594. .bad:
  11595.  moveq #-1,d4              ;too big/can't open window
  11596.  bra.s .done
  11597.  
  11598. .null:
  11599.  subq.w #1,xxp_ReqNull(a4) ;clear ReqNull
  11600.  moveq #0,d4               ;dummy choice=1
  11601.  bra.s .done
  11602.  
  11603. .oom:
  11604.  move.l #1,xxp_errn(a4)    ;out of public ram
  11605.  bra.s .badp
  11606.  
  11607. .v39:
  11608.  move.l #22,xxp_errn(a4)   ;needs lib vers 39+
  11609.  
  11610. .badp:
  11611.  moveq #-1,d4
  11612.  bra.s .pop
  11613.  
  11614. .done:
  11615.  move.l a3,a1              ;release rgb mem
  11616.  move.l xxp_sysb(a4),a6
  11617.  jsr _LVOFreeVec(a6)
  11618.  
  11619. .pop:
  11620.  move.l d4,d0              ;D0=0 if bad/cancel, else 1+=choice
  11621.  addq.l #1,d0
  11622.  bsr TLWslof               ;clear all message buffers
  11623.  add.w #xxp_WPort+4,a7     ;discard dummy IntuiText
  11624.  movem.l (a7)+,d1-d7/a0-a6
  11625.  
  11626.  move.l (a7)+,xxp_hook(a4) ;restore slider data
  11627.  move.l (a7)+,xxp_strs(a4)
  11628.  move.l (a7)+,xxp_totl(a4)
  11629.  move.l (a7)+,xxp_tops(a4)
  11630.  move.l (a7)+,xxp_slih(a4)
  11631.  move.l (a7)+,xxp_sliw(a4)
  11632.  move.l (a7)+,xxp_sliy(a4)
  11633.  move.l (a7)+,xxp_slix(a4)
  11634.  
  11635.  move.l (a7)+,xxp_butl(a4) ;restore button data
  11636.  move.l (a7)+,xxp_butk(a4)
  11637.  move.l (a7)+,xxp_btdy(a4)
  11638.  move.l (a7)+,xxp_btdx(a4)
  11639.  move.l (a7)+,xxp_buth(a4)
  11640.  move.l (a7)+,xxp_butw(a4)
  11641.  move.l (a7)+,xxp_buty(a4)
  11642.  move.l (a7)+,xxp_butx(a4)
  11643.  
  11644.  move.l (a7)+,xxp_strg(a4)
  11645.  move.l (a7)+,xxp_Help(a4)
  11646.  
  11647.  tst.l d0                  ;EQ, D0=0 if bad, else 1+ = choice
  11648.  rts
  11649.  
  11650. ; TLReqcolor subroutine - load color map
  11651.  
  11652. .load:                     ;** here to load
  11653.  movem.l d0-d7/a0-a6,-(a7)
  11654.  
  11655.  move.l a4,a0
  11656.  add.l #104,a0             ;see that ENV:Tandem exists
  11657.  move.l #'Tand',(a0)
  11658.  move.w #'em',4(a0)
  11659.  clr.b 6(a0)
  11660.  moveq #0,d0
  11661.  bsr TLPrefdir
  11662.  beq .ldqt                 ;go if fails (unlikely)
  11663.  
  11664.  move.l #'/Col',6(a0)      ;see that ENV:Tandem/Colors exists
  11665.  move.l #'ors ',10(a0)
  11666.  clr.b 13(a0)
  11667.  moveq #0,d0
  11668.  bsr TLPrefdir
  11669.  beq .ldqt                 ;go if fails (unlikely)
  11670.  
  11671.  subq.l #4,a0
  11672.  move.l #'ENV:',(a0)       ;ENV:Tandem/Color at a0 = a4+100
  11673.  move.l a0,a1
  11674.  add.l #130,a1             ;fname at a4+230
  11675.  clr.b (a1)
  11676.  
  11677.  moveq #70,d0              ;get filename
  11678.  moveq #1,d1
  11679.  exg a0,a1
  11680.  bsr TLAslfile
  11681.  exg a0,a1
  11682.  tst.l d0
  11683.  beq.s .ldqt               ;go if asl failed/cancelled
  11684.  
  11685.  bsr TLOpenread            ;open file
  11686.  beq.s .ldqt               ;quit if can't
  11687.  
  11688.  move.l a3,d2              ;read up to 2^planes X 3 longwords bytes at a3+4
  11689.  addq.l #4,d2
  11690.  moveq #1,d3
  11691.  move.l xxp_Depth(a4),d0
  11692.  rol.l d0,d3               ;d3=no. of colors
  11693.  mulu #12,d3               ;d3=bytes in colour table
  11694.  bsr TLReadfile
  11695.  beq.s .ldqt               ;go if bad read
  11696.  bsr TLClosefile           ;close file
  11697.  
  11698.  move.l xxp_gfxb(a4),a6    ;set colours as read
  11699.  move.l xxp_Screen(a4),a0
  11700.  add.l #sc_ViewPort,a0
  11701.  move.l a3,a1
  11702.  move.l 3076(a3),-(a7)
  11703.  clr.l 3076(a3)
  11704.  jsr _LVOLoadRGB32(a6)
  11705.  move.l (a7)+,3076(a3)
  11706.  bra.s .ldbk
  11707.  
  11708. .ldqt:
  11709.  bsr .beep                 ;beep if load failed
  11710.  
  11711. .ldbk:
  11712.  movem.l (a7)+,d0-d7/a0-a6
  11713.  rts
  11714.  
  11715. ; TLReqcolor "subroutine" - hook for slider
  11716.  
  11717. .hook:                     ;** process the slider
  11718.  move.l 50(a4),a3          ;retrieve data stored here by caller to TLSlider
  11719.  move.l 54(a4),d4
  11720.  move.l 58(a4),d5
  11721.  move.l d5,d0              ;point to color in pens data
  11722.  lsl.l #2,d0
  11723.  move.l d4,d1
  11724.  mulu #12,d1
  11725.  add.l d1,d0
  11726.  move.b xxp_tops+3(a4),4(a3,d0.w) ;put tops there
  11727.  move.b xxp_tops+3(a4),5(a3,d0.w)
  11728.  move.b xxp_tops+3(a4),6(a3,d0.w)
  11729.  move.b xxp_tops+3(a4),7(a3,d0.w)
  11730.  move.l xxp_gfxb(a4),a6
  11731.  move.l xxp_Screen(a4),a0  ;update this pen
  11732.  add.l #sc_ViewPort,a0
  11733.  move.l a4,a1              ;place data in buff
  11734.  move.w #1,(a1)
  11735.  move.w d4,2(a1)
  11736.  move.l d4,d0
  11737.  mulu #12,d0
  11738.  move.l 4(a3,d0.w),4(a4)
  11739.  move.l 8(a3,d0.w),8(a4)
  11740.  move.l 12(a3,d0.w),12(a4)
  11741.  clr.l 16(a4)
  11742.  jsr _LVOLoadRGB32(a6)
  11743.  move.l xxp_tops(a4),d0    ;put tops in box
  11744.  move.l a4,a0
  11745.  move.l #'    ',(a4)
  11746.  clr.b 4(a4)
  11747.  bsr TLHexasc
  11748.  move.w #$0103,xxp_FrontPen(a5)
  11749.  move.l d5,d1
  11750.  mulu #11,d1
  11751.  add.w #103,d1
  11752.  moveq #4,d0
  11753.  bsr TLText
  11754.  rts
  11755.  
  11756. ; TLReqcolor subroutine - save color prefs
  11757.  
  11758. .save:                     ;** save cols d0=0use -1save a3=map (3076 bytes)
  11759.  movem.l d0-d7/a0-a6,-(a7) ;save all
  11760.  move.l d0,d7              ;d7= -1save 0use
  11761.  
  11762.  move.l a4,a0
  11763.  add.l #104,a0             ;see that ENV:Tandem exists
  11764.  move.l #'Tand',(a0)
  11765.  move.w #'em',4(a0)
  11766.  clr.b 6(a0)
  11767.  bsr TLPrefdir
  11768.  beq .svbd                 ;go if fails (unlikely)
  11769.  
  11770.  move.l #'/Col',6(a0)      ;save as Tandem/Color  (= operative pref)
  11771.  move.w #'or',10(a0)
  11772.  clr.w 12(a0)
  11773.  move.l a3,d2              ;d2 = save from = colour table in a3+4
  11774.  addq.l #4,d2
  11775.  move.l #3072,d3           ;d3 = bytes = 256 * 12
  11776.  move.l d7,d0              ;d0 = -1 save  0 use
  11777.  bsr TLPreffil
  11778.  beq .svbd                 ;go if can't
  11779.  
  11780.  move.l d7,d0              ;see that ENV:Tandem/Colors exists
  11781.  move.b #'s',12(a0)
  11782.  bsr TLPrefdir
  11783.  beq .svbd                 ;go if fails (unlikely)
  11784.  
  11785.  subq.l #4,a0
  11786.  move.l #'ENV:',(a0)       ;ENV:Tandem/Colors at a0 = a4+100
  11787.  move.l a0,a1
  11788.  add.l #130,a1             ;get fname at a4+230
  11789.  clr.b (a1)
  11790.  moveq #69,d0              ;hail = string 69
  11791.  moveq #-1,d1              ;d1=-1 for asl save
  11792.  exg a0,a1
  11793.  bsr TLAslfile             ;get filename
  11794.  exg a0,a1
  11795.  
  11796.  tst.l d0
  11797.  beq.s .svbd               ;go if asl failed(unlikely)/cancelled
  11798.  
  11799. .fgot:
  11800.  cmp.l #'ENV:',(a0)+
  11801.  bne.s .svbd               ;quit if user muddled up volume
  11802.  
  11803.  move.l a0,a2              ;create path without vol in a0
  11804. .sva1:
  11805.  tst.b (a2)+               ;find end of dir
  11806.  bne .sva1
  11807.  move.b #'/',-1(a2)        ;append /
  11808. .sva2:
  11809.  move.b (a1)+,(a2)+        ;append filepart
  11810.  bne .sva2
  11811.  move.l d7,d0              ;save/use 3072 bytes from a3+4
  11812.  bsr TLPreffil             ;save as filename in ENV:Tandem/Colors
  11813.                            ;(no report if can't)
  11814. .svbd:
  11815.  movem.l (a7)+,d0-d7/a0-a6
  11816.  rts
  11817.  
  11818. ; TLReqcolor subroutine - beep
  11819.  
  11820. .beep:
  11821.  movem.l d0-d1/a0-a1/a6,-(a7)
  11822.  move.l xxp_intb(a4),a6
  11823.  move.l xxp_Screen(a4),a0
  11824.  jsr _LVODisplayBeep(a6)
  11825.  movem.l (a7)+,d0-d1/a0-a1/a6
  11826.  rts
  11827.  
  11828. ; TLReqcolor subroutine - clear requester
  11829.  
  11830. .clir:
  11831.  moveq #0,d0
  11832.  moveq #0,d1
  11833.  move.l #292,d2
  11834.  move.l #156,d3
  11835.  moveq #3,d4
  11836.  bset #29,d0
  11837.  bsr TLReqarea
  11838.  bclr #29,d0
  11839.  bsr TLReqbev
  11840.  rts
  11841.  
  11842. ; TLreqcolor subroutine - choose Save/Use/Cancel
  11843.  
  11844. .pref:
  11845.  bsr .clir
  11846.  moveq #68,d0
  11847.  bsr TLStrbuf
  11848.  moveq #4,d0
  11849.  move.l #147,d1
  11850.  bsr TLText
  11851.  moveq #0,d0
  11852.  subq.w #1,d1
  11853.  moveq #97,d2
  11854.  moveq #10,d3
  11855.  bsr TLReqbev
  11856.  add.l d2,d0
  11857.  bsr TLReqbev
  11858.  add.l d2,d0
  11859.  addq.l #1,d2
  11860.  bsr TLReqbev
  11861.  
  11862.  move.l xxp_AcWind(a4),a5
  11863.  move.w #$0203,xxp_FrontPen(a5)
  11864.  moveq #2,d1
  11865.  moveq #57,d2
  11866. .prfp:
  11867.  move.l d2,d0
  11868.  bsr TLStrbuf
  11869.  moveq #4,d0
  11870.  bsr TLText
  11871.  move.b #$01,xxp_FrontPen(a5)
  11872.  addq.w #8,d1
  11873.  addq.w #1,d2
  11874.  cmp.w #68,d2
  11875.  bne .prfp
  11876.  
  11877. .prfw:
  11878.  bsr TLKeyboard
  11879.  cmp.b #$1B,d0
  11880.  beq.s .prfc
  11881.  cmp.b #$80,d0
  11882.  bne .prfw
  11883.  cmp.w #146,d2
  11884.  bcs .prfw
  11885.  cmp.w #194,d1
  11886.  bcc.s .prfc
  11887.  cmp.w #97,d1
  11888.  bcc.s .prfu
  11889.  
  11890. .prfs:
  11891.  moveq #0,d0
  11892.  rts
  11893.  
  11894. .prfu:
  11895.  moveq #1,d0
  11896.  rts
  11897.  
  11898. .prfc:
  11899.  moveq #2,d0
  11900.  rts
  11901.  
  11902. .strc: dc.b 0,'Select a name for the palette',0
  11903. .tabl: dc.b 0,0,1,2,1,4,1,8,2,8,4,8,8,8,8,16,8,32 ;cols,rows for planes
  11904.  
  11905. .strs: dc.b 0
  11906.  dc.b 'You are required to choose a pen',0 ;1    [task 0 help]
  11907.  dc.b 0 ;2
  11908.  dc.b 'First, click any of the colours in',0 ;3
  11909.  dc.b 'the table of colours. It will',0 ;4
  11910.  dc.b 'appear in the box at the bottom of  ',0 ;5
  11911.  dc.b 'the requester. If you want decide',0 ;6
  11912.  dc.b 'to choose it, click the "Choose"',0 ;7
  11913.  dc.b 'box, or else you can try another',0 ;8
  11914.  dc.b 'of the colours in the table.',0 ;9
  11915.  dc.b 0 ;10
  11916.  dc.b 'Else, click "Cancel" if you ',0 ;11
  11917.  dc.b 'decide you don''t want to choose a',0 ;12
  11918.  dc.b 'pen.',0 ;13
  11919.  dc.b 0 ;14
  11920.  dc.b 0 ;15
  11921.  dc.b 0 ;16
  11922.  dc.b 0 ;17
  11923.  dc.b 0 ;18
  11924.  
  11925.  dc.b 'Choose a pen ...',0 ;19               [task 1 help]
  11926.  dc.b 0 ;20
  11927.  dc.b 'Click any colour in the table to',0 ;21
  11928.  dc.b 'place it in the bottom box. Click   ',0 ;22
  11929.  dc.b '"Choose" to choose it.',0 ;23
  11930.  dc.b 'Else, click "Cancel" if you don''t',0 ;24
  11931.  dc.b 'want to make a choice.',0 ;25
  11932.  dc.b 0 ;26
  11933.  dc.b 'You can also load a palette with',0 ;27
  11934.  dc.b 'the "Load" button.',0 ;28
  11935.  dc.b 0 ;29
  11936.  dc.b 'You can adjust individual pens by',0 ;30
  11937.  dc.b 'clicking them into the bottom box',0 ;31
  11938.  dc.b '& using the sliders.',0 ;32
  11939.  dc.b 0 ;33
  11940.  dc.b 'If you click "Save" you can also ',0 ;34
  11941.  dc.b 'set the colour palette preferences.',0 ;35
  11942.  dc.b 0 ;36
  11943.  
  11944.  dc.b 'Adjust the colour palette ...',0 ;37    [task 2 help]
  11945.  dc.b 0 ;38
  11946.  dc.b 'Click any of the colours in the',0 ;39
  11947.  dc.b 'colour table to put it in the',0 ;40
  11948.  dc.b 'bottom box. When there, you can',0 ;41
  11949.  dc.b 'adjust it using the sliders.',0 ;42
  11950.  dc.b 0 ;43
  11951.  dc.b 'You can also load a palette that',0 ;44
  11952.  dc.b 'has previously been saved by',0 ;45
  11953.  dc.b 'clicking the "Load" button.',0 ;46
  11954.  dc.b 0 ;47
  11955.  dc.b 'Finally, click "Save" to keep the   ',0 ;48
  11956.  dc.b 'palette & perhaps save it to disk.',0 ;49
  11957.  dc.b 0 ;50
  11958.  dc.b 'Else, click Cancel (or press Esc)',0 ;51
  11959.  dc.b 'to cancel all changes.',0 ;52
  11960.  dc.b 0 ;53
  11961.  dc.b 0 ;54
  11962.  
  11963.  dc.b 'Choose a pen (<Help> available)',0 ;55
  11964.  dc.b 'Colour palette (<Help> available)',0;56
  11965.  
  11966.  dc.b 'You have chosen "Save"....',0 ;57
  11967.  dc.b 0 ;58
  11968.  dc.b 'You may choose "Save" below to',0 ;59
  11969.  dc.b 'save the palette in preferences',0 ;60
  11970.  dc.b '(permanently) for this program.',0 ;61
  11971.  dc.b 0 ;62
  11972.  dc.b 'Or, choose "Use" the palette',0 ;63
  11973.  dc.b 'temporarily for this program.',0 ;64
  11974.  dc.b 0 ;65
  11975.  dc.b 'Or, choose "Cancel" to cancel all',0 ;66
  11976.  dc.b 'changes to the palette.',0 ;67
  11977.  dc.b '   Save          Use       Cancel',0 ;68
  11978.  
  11979.  dc.b 'Specify a name for the color map...',0 ;69
  11980.  dc.b 'Choose a color map to load...',0 ;70
  11981.  ds.w 0
  11982.  
  11983. *>>>> create a prefs dir (unless already exists) a0=dirname d0: 0=use -1=sav
  11984. TLPrefdir:
  11985.  movem.l d1-d7/a0-a6,-(a7) ;save all
  11986.  clr.l xxp_errn(a4)
  11987.  sub.l #132,a7             ;workspace in stack
  11988.  move.l a7,a5
  11989.  move.l d0,d3              ;d3=0/-1
  11990.  move.l a0,a2              ;a2=dir
  11991.  move.l xxp_dosb(a4),a6    ;a6=dosbase
  11992.  move.l a5,a1              ;ENV: in buffer
  11993.  move.l #'ENV:',(a1)+
  11994.  bsr.s .item               ;create in ENV:
  11995.  beq.s .quit               ;go if can't
  11996.  tst.l d3
  11997.  beq.s .quit               ;go if use
  11998.  move.l a5,a1
  11999.  move.l #'ENVA',(a1)+      ;ENVARC: in buffer
  12000.  move.l #'RC: ',(a1)+
  12001.  subq.l #1,a1
  12002.  bsr.s .item               ;create in ENVARC:
  12003. .quit:
  12004.  tst.l d0
  12005.  add.l #132,a7
  12006.  movem.l (a7)+,d1-d7/a0-a6 ;EQ, D0=0 if bad
  12007.  rts
  12008. .item:                     ;** save in ENV/ENVARC
  12009.  move.l a2,a0              ;append dirname to dev
  12010. .dir:
  12011.  move.b (a0)+,(a1)+
  12012.  bne .dir
  12013.  move.l a5,d1              ;try to lock dir
  12014.  moveq #ACCESS_READ,d2
  12015.  jsr _LVOLock(a6)
  12016.  move.l d0,d1
  12017.  bne.s .good               ;go if exists
  12018.  move.l a5,d1
  12019.  jsr _LVOCreateDir(a6)     ;else, create it
  12020.  move.l d0,d1
  12021.  bne.s .good
  12022.  move.w #23,xxp_errn+2(a4) ;bad if can't create it
  12023.  moveq #0,d0
  12024.  rts
  12025. .good:
  12026.  jsr _LVOUnLock(a6)
  12027.  moveq #-1,d0
  12028.  rts
  12029.  
  12030. *>>>> save a prefs file (call TLPrefdir first with all except filepart)
  12031. ; a0=path to be appended to ENV: or ENVARC:  D0: 0=use -1=save
  12032. ; d2,d3=where, bytes
  12033. TLPreffil:
  12034.  movem.l d1-d7/a0-a6,-(a7) ;save all exc d0
  12035.  clr.l xxp_errn(a4)
  12036.  sub.l #132,a7             ;create workspace
  12037.  move.l a7,a5
  12038.  move.l a0,a2              ;a2=path
  12039.  move.l d0,d4              ;d3=0/-1
  12040.  move.l a5,a1              ;try to save in ENV:
  12041.  move.l #'ENV:',(a1)+
  12042.  bsr.s .save
  12043.  beq.s .done               ;bad if can't
  12044.  tst.l d4
  12045.  beq.s .done               ;done if use
  12046.  move.l a5,a1              ;try to save in ENVARC:
  12047.  move.l #'ENVA',(a1)+
  12048.  move.l #'RC: ',(a1)+
  12049.  subq.l #1,a1
  12050.  bsr.s .save               ;bad if can't
  12051. .done:
  12052.  tst.l d0
  12053.  add.l #132,a7
  12054.  movem.l (a7)+,d1-d7/a0-a6 ;EQ, D0=0 if bad
  12055.  rts
  12056.  
  12057. .save:                     ;** append path to vol & save (NE if ok)
  12058.  move.l a2,a0
  12059. .tfr:
  12060.  move.b (a0)+,(a1)+
  12061.  bne .tfr
  12062.  movem.l d1-d2/a0-a1/a6,-(a7) ;open file; name in (a5)
  12063.  move.l xxp_dosb(a4),a6
  12064.  move.l a5,d1
  12065.  move.l #MODE_NEWFILE,d2
  12066.  jsr _LVOOpen(a6)
  12067.  move.l d0,xxp_hndl(a4)     ;sv handle
  12068.  beq.s .bad
  12069.  movem.l (a7)+,d1-d2/a0-a1/a6
  12070.  beq.s .bad
  12071.  bsr TLWritefile
  12072.  beq.s .badc
  12073.  bsr TLClosefile
  12074.  
  12075. .good:
  12076.  moveq #-1,d0
  12077.  rts
  12078.  
  12079. .bad:
  12080.  movem.l (a7)+,d1-d2/a0-a1/a6
  12081. .badc:
  12082.  move.w #24,xxp_errn+2(a4) ;EQ, D0=0 if bad
  12083.  moveq #0,d0
  12084.  rts
  12085.  
  12086.  
  12087. *>>>> menu item on  d0=strip d1=item(-1 if none) d2=sub-item(-1 if none)
  12088. TLOnmenu:
  12089.  movem.l d0-d2/a0-a1/a5-a6,-(a7)
  12090.  move.l xxp_intb(a4),a6
  12091.  move.l xxp_AcWind(a4),a5
  12092.  move.l xxp_Window(a5),a0
  12093.  and.l #31,d0
  12094.  and.w #63,d1
  12095.  rol.w #5,d1
  12096.  or.w d1,d0
  12097.  and.w #31,d2
  12098.  ror.w #5,d2
  12099.  or.w d2,d0
  12100.  jsr _LVOOnMenu(a6)
  12101.  movem.l (a7)+,d0-d2/a0-a1/a5-a6
  12102.  rts
  12103.  
  12104.  
  12105. *>>>> menu item on  d0=strip d1=item(-1 if none) d2=sub-item(-1 if none)
  12106. TLOffmenu:
  12107.  movem.l d0-d2/a0-a1/a5-a6,-(a7)
  12108.  move.l xxp_intb(a4),a6
  12109.  move.l xxp_AcWind(a4),a5
  12110.  move.l xxp_Window(a5),a0
  12111.  and.l #31,d0
  12112.  and.w #63,d1
  12113.  rol.w #5,d1
  12114.  or.w d1,d0
  12115.  and.w #31,d2
  12116.  ror.w #5,d2
  12117.  or.w d2,d0
  12118.  jsr _LVOOffMenu(a6)
  12119.  movem.l (a7)+,d0-d2/a0-a1/a5-a6
  12120.  rts
  12121.  
  12122.  
  12123. *>>>> get an ILBM file into a bitmap
  12124.  
  12125. ; D0: -1=load BMHD,CMAP and BODY.  0=load BMHD/CMAP only
  12126. ; D1 = maxnum of bitplanes to load (set bit 31 to use public mem, else chip)
  12127.  
  12128. ; A1    = 790 byte buffer for BMHD,CMAP
  12129. ;         (loads BMHD in bytes 0-19, CMAPsize in bytes 20-21, CMAP in 22+)
  12130. ;         (loads CMAP as 3 bytes per colour, so 256 colours = 768 bytes)
  12131.  
  12132. ; returns A0 = address of bitmap created (unless D0 was 0)
  12133.  
  12134. ; ***** Important!! *******
  12135. ; The Bitmap & its bitplanes will be created by _LVOAllocVec,
  12136. ; NOT TLpublic/TLchip. When finished with it, pass its address to TLfreebmap
  12137.  
  12138. TLGetilbm
  12139.  movem.l d0-d7/a0-a6,-(a7) ;save all, exc if result in A0
  12140.  clr.l xxp_errn(a4)
  12141.  
  12142.  bsr TLOpenread            ;open file
  12143.  beq .bad1                 ;bad if can't
  12144.  
  12145.  moveq #12,d3              ;read file header
  12146.  moveq #12,d7
  12147.  bsr .read
  12148.  beq .bad
  12149.  
  12150.  cmp.l #'FORM',(a4)        ;validate header, initiate byte count
  12151.  bne .bad2
  12152.  cmp.l #'ILBM',8(a4)
  12153.  bne .bad3
  12154.  move.l 4(a4),d7
  12155.  subq.l #4,d7
  12156.  ble .bad4
  12157.  
  12158.  moveq #0,d6               ;d6 = 0 until BMHD found
  12159.  clr.w 20(a1)              ;buffer+20 = CMAP size (0 if none)
  12160.  
  12161. .chnk:                     ;* scan chunks for CMAP,BMHD,BODY (ignore others)
  12162.  moveq #8,d3               ;read next chunk...
  12163.  bsr .read                 ;get chunk header
  12164.  beq .bad                  ;bad if can't
  12165.  move.l 4(a4),d3           ;d3=chunk size
  12166.  beq .chnk                 ;ignore if null size
  12167.  cmp.l d3,d7
  12168.  bcs .bad4                 ;bad if less bytes left than chunk size
  12169.  
  12170.  cmp.l #'CMAP',(a4)
  12171.  beq .cmap                 ;go if CMAP
  12172.  cmp.l #'BODY',(a4)
  12173.  beq .body                 ;go if BODY
  12174.  cmp.l #'BMHD',(a4)
  12175.  beq.s .bmhd               ;go if BMHD
  12176.  
  12177.  bsr .skip                 ;discard all other chunks
  12178.  sub.l d3,d7
  12179.  bra .chnk
  12180.  
  12181. .bmhd:                     ;* bmhd found
  12182.  tst.l d6
  12183.  bne .bad4                 ;bad if duplicate BMHD
  12184.  moveq #-1,d6              ;flag found
  12185.  cmp.l #20,d3
  12186.  bne .bad4                 ;bad unless size=20
  12187.  move.l a1,d2
  12188.  bsr .rdcu                 ;read into a1 buffer
  12189.  beq .bad
  12190.  cmp.b #1,10(a1)
  12191.  bhi .bad5                 ;bad unless compression = 0(none), 1(cmpbyterun)
  12192.  tst.b 8(a1)
  12193.  beq .bad4
  12194.  cmp.b #9,8(a1)            ;bad if planes=0, or >8
  12195.  bcc .bad4
  12196.  tst.w (a1)                ;bad if width=0, or >2048
  12197.  beq .bad4
  12198.  cmp.w #2049,d0
  12199.  bcc .bad4
  12200.  tst.w 2(a1)               ;bad if height=0, or >2048
  12201.  beq .bad4
  12202.  cmp.w #2049,2(a1)
  12203.  bcc .bad4
  12204.  bra .chnk                 ;to next chunk
  12205.  
  12206. .cmap:                     ;* cmap found
  12207.  tst.w 20(a1)
  12208.  bne .bad4                 ;bad if duplicate cmap
  12209.  cmp.l #768,d3
  12210.  bhi .bad4                 ;bad if > 256*3 bytes
  12211.  move.w d3,20(a1)          ;put CMAP size in 20(a1)
  12212.  move.l a1,d2
  12213.  add.l #22,d2
  12214.  bsr .rdcu                 ;read into 22(a1)
  12215.  beq .bad                  ;bad if can't
  12216.  bra .chnk                 ;to next chunk
  12217.  
  12218. .body:                     ;* body found
  12219.  tst.l d6
  12220.  beq .bad4                 ;bad if bmhd absent
  12221.  cmp.l d7,d3
  12222.  bhi .bad4                 ;bad if chunk size > remaining bytes
  12223.  tst.l (a7)
  12224.  beq .done                 ;done if load BMHD,CMAP only
  12225.  
  12226.  move.l 4(a7),d5           ;set d5 = planes in bitmap
  12227.  cmp.b 8(a1),d5
  12228.  ble.s .rows
  12229.  move.b 8(a1),d5
  12230. .rows:
  12231.  
  12232.  moveq #0,d6
  12233.  move.w (a1),d6            ;set d6 = bytes per row in bitplanes
  12234.  add.w #15,d6
  12235.  lsr.w #4,d6
  12236.  lsl.w #1,d6
  12237.  
  12238.  move.l xxp_sysb(a4),a6    ;create bitmap, point A3 to bitmap
  12239.  moveq #bm_SIZEOF,d0
  12240.  moveq #MEMF_PUBLIC,d1
  12241.  move.l a1,-(a7)
  12242.  jsr _LVOAllocVec(a6)
  12243.  move.l (a7)+,a1
  12244.  tst.l d0
  12245.  beq .bad7
  12246.  move.l d0,a3
  12247.  
  12248.  move.l a3,a2              ;fill in bitmap elements
  12249.  move.w d6,(a2)+           ;bm_BytesPerRow
  12250.  move.w 2(a1),(a2)+        ;bm_Rows
  12251.  clr.b (a2)+               ;bm_Flags
  12252.  move.b d5,(a2)+           ;bm_Depth
  12253.  clr.w (a2)+               ;bm_Pad
  12254.  
  12255.  move.w d5,d2              ;allocate bitplanes - d2 counts
  12256.  subq.w #1,d2
  12257.  move.w 2(a1),d3           ;d3 = bytes each bitplane
  12258.  mulu d6,d3
  12259.  move.l a4,a5              ;(set up bitplane pointers at buff+480)
  12260.  add.w #480,a5
  12261. .bmap:                     ;for each plane...
  12262.  move.l d3,d0
  12263.  moveq #MEMF_CHIP,d1
  12264.  tst.l 4(a7)
  12265.  bpl.s .chip
  12266.  moveq #MEMF_PUBLIC,d1     ;(if input D1 had bit 31, use public mem)
  12267. .chip:
  12268.  move.l a1,-(a7)
  12269.  jsr _LVOAllocVec(a6)      ;allocate mem
  12270.  move.l (a7)+,a1
  12271.  tst.l d0
  12272.  beq.s .bmbd               ;go if can't
  12273.  move.l d0,(a2)+           ;else, put in next pointer
  12274.  move.l d0,(a5)+           ;& in bitplane pointers
  12275.  dbra d2,.bmap             ;until all allocated
  12276.  bra.s .bmok               ;go bitmap is ready
  12277.  
  12278. .bmbd:
  12279.  bsr .kill                 ;kill partially allocated bitmap
  12280.  bra .bad6                 ;& go report out of chip ram
  12281.  
  12282. .bmok:
  12283.  tst.b 10(a1)              ;go if compressed
  12284.  bne.s .comr
  12285.  
  12286.  move.l d6,d3              ;* read uncompressed  - d3 = bytes per row
  12287.  move.w 2(a1),d6
  12288.  subq.w #1,d6              ;d6 counts scanlines
  12289. .slin:                     ;for each scanline...
  12290.  
  12291.  move.l a4,a5              ;point to bitplane pointers
  12292.  add.w #480,a5
  12293.  move.w d5,d4              ;d4 counts bitplanes
  12294.  subq.w #1,d4
  12295.  
  12296. .slip:                     ;read a bitplane
  12297.  move.l (a5),d2            ;d2 = where
  12298.  bsr TLReadfile            ;read it
  12299.  beq .badr                 ;bad if can't
  12300.  add.l d3,(a5)+            ;bump pointer
  12301.  dbra d4,.slip             ;until all bitplanes read
  12302.  
  12303.  moveq #0,d4
  12304.  move.b 8(a1),d4           ;d4 = bitplanes in file
  12305.  sub.w d5,d4               ;sub bitplanes read
  12306.  beq.s .slis               ;go if all read
  12307.  mulu d3,d4                ;else, * bytes per plane = bytes to skip
  12308.  exg d3,d4
  12309.  bsr .skip                 ;skip unwanted bitplanes
  12310.  exg d3,d4
  12311.  
  12312. .slis:
  12313.  dbra d6,.slin             ;until all scanlines done
  12314.  move.l a3,32(a7)          ;put bitmap into stack a0 (= result)
  12315.  bra .done                 ;return ok
  12316.  
  12317. .comr:                     ;* read compressed
  12318.  
  12319.  move.l a4,a6              ;init input buffer pointer
  12320.  clr.w 478(a4)
  12321.  move.l d6,d3              ;d3 = bytes per row
  12322.  move.w 2(a1),d6
  12323.  subq.w #1,d6              ;d6 counts scanlines
  12324. .comn:                     ;for each scanline...
  12325.  
  12326.  move.l a4,a5              ;point to bitplane pointers
  12327.  add.w #480,a5
  12328.  move.w d5,d4              ;d4 counts bitplanes
  12329.  subq.w #1,d4
  12330.  
  12331. .comp:                     ;read a bitplane
  12332.  move.l (a5),a2            ;d2 = where
  12333.  move.w d3,d1              ;d1 counts bytes in row
  12334.  
  12335. .item:
  12336.  bsr .byte                 ;check input buffer
  12337.  beq.s .badr               ;go if bad read
  12338.  moveq #0,d0
  12339.  move.b (a6)+,d0           ;get next type of thing
  12340.  bmi.s .mult
  12341.  sub.w d0,d1
  12342.  subq.w #1,d1
  12343.  bmi .bad4
  12344.  move.w d0,d7
  12345. .iget:
  12346.  bsr .byte
  12347.  beq.s .badr
  12348.  move.b (a6)+,(a2)+
  12349.  dbra d7,.iget
  12350.  tst.w d1
  12351.  bne .item
  12352.  bra.s .itfn
  12353.  
  12354. .mult:
  12355.  neg.b d0
  12356.  bmi .item
  12357.  sub.w d0,d1
  12358.  subq.w #1,d1
  12359.  bmi .bad4
  12360.  move.w d0,d7
  12361.  bsr.s .byte
  12362.  beq.s .badr
  12363.  move.b (a6)+,d0
  12364. .mulp:
  12365.  move.b d0,(a2)+
  12366.  dbra d7,.mulp
  12367.  tst.w d1
  12368.  bne .item
  12369.  
  12370. .itfn:
  12371.  add.l d3,(a5)+            ;bump pointer
  12372.  dbra d4,.comp             ;until all bitplanes read
  12373.  
  12374.  moveq #0,d4
  12375.  move.b 8(a1),d4           ;d4 = bitplanes in file
  12376.  sub.w d5,d4               ;subtract bitplanes read
  12377.  beq.s .coms               ;go if all read
  12378.  mulu d3,d4                ;else, * bytes per plane = bytes to skip
  12379.  exg d3,d4
  12380.  bsr .skip                 ;skip unwanted bitplanes
  12381.  exg d3,d4
  12382.  
  12383. .coms:
  12384.  dbra d6,.comn             ;until all scanlines done
  12385.  move.l a3,32(a7)          ;put bitmap into stack a0 (= result)
  12386.  bra.s .done               ;return ok
  12387.  
  12388. .badr:                     ;here if bitplane reading fails
  12389.  bsr .kilr
  12390.  bra.s .bad
  12391. .bad1:                     ;can't open file
  12392.  moveq #25,d0
  12393.  bra.s .bad
  12394. .bad2:                     ;not IFF
  12395.  moveq #26,d0
  12396.  bra.s .bad
  12397. .bad3:                     ;not ILBM
  12398.  moveq #27,d0
  12399.  bra.s .bad
  12400. .bad4:                     ;garbled
  12401.  moveq #28,d0
  12402.  bra.s .bad
  12403. .bad5:                     ;unrecognised compression mode
  12404.  moveq #29,d0
  12405.  bra.s .bad
  12406. .bad6:                     ;out of chip RAM
  12407.  moveq #2,d0
  12408.  bra.s .bad
  12409. .bad7:                     ;out of public RAM
  12410.  moveq #1,d0
  12411. .bad:
  12412.  move.l d0,xxp_errn(a4)
  12413.  
  12414. .done:
  12415.  bsr TLClosefile           ;close file if still open
  12416.  movem.l (a7)+,d0-d7/a0-a6
  12417.  tst.l xxp_errn(a4)
  12418.  eori.w #-1,CCR            ;EQ, errn<> if bad
  12419.  rts
  12420.  
  12421. ; subroutine for TLGetilbm - check compressed input buffer non-empty
  12422.  
  12423. .byte:
  12424.  subq.w #1,478(a4)         ;dec input buffer count
  12425.  ble.s .bytf
  12426.  rts                       ;return if some, NE
  12427. .bytf:
  12428.  bne.s .bytr               ;go replenish if none
  12429.  eori.w #-1,CCR            ;set NE
  12430.  rts
  12431. .bytr:
  12432.  movem.l d0/d2-d3,-(a7)    ;replenish input buffer
  12433.  move.l #478,d3            ;read 478 (ok if <478 still there)
  12434.  move.w d3,478(a4)         ;replenish buffer count
  12435.  move.l a4,d2              ;read to buff
  12436.  move.l a4,a6              ;a6 points to input buffer
  12437.  bsr TLReadfile            ;read
  12438.  movem.l (a7)+,d0/d2-d3
  12439.  bne .byte
  12440.  rts                       ;EQ if bad
  12441.  
  12442. ; subroutine for TLGetilbm - read d3 bytes to xxp_buff, d7 is countdown
  12443.  
  12444. .read:                     ;** 1st entry point - read to (a4)
  12445.  move.l a4,d2
  12446. .rdcu:                     ;** 2nd entry point - read to (d2)
  12447.  bsr TLReadfile
  12448.  beq .rbad
  12449.  cmp.l d0,d3               ;bad if d3 bytes not read
  12450.  bne.s .rbad
  12451.  sub.l d0,d7               ;dec countdown
  12452.  bcc.s .rdon
  12453. .rbad:
  12454.  move.w #28,xxp_errn+2(a4)
  12455. .rdon:
  12456.  tst.w xxp_errn+2(a4)
  12457.  eori.w #-1,CCR            ;EQ, errn<> if bad
  12458.  rts
  12459.  
  12460. ; subroutine for TLGetilbm - skip d3 bytes forward in file
  12461.  
  12462. .skip:
  12463.  movem.l d0-d3/a0-a1/a6,-(a7) ;save all exc d7 updated
  12464.  move.l xxp_dosb(a4),a6
  12465.  move.l xxp_hndl(a4),d1
  12466.  move.l d3,d2
  12467.  moveq #OFFSET_CURRENT,d3  ;seek d3 past current posn
  12468.  jsr _LVOSeek(a6)
  12469.  movem.l (a7)+,d0-d3/a0-a1/a6
  12470.  rts
  12471.  
  12472. ; subroutine for TLGetilbm - kill bitmap  (at a3)
  12473.  
  12474. .kilr:                     ;** 1st entry point - kill entire
  12475.  move.l a3,a2
  12476.  add.w #bm_Planes,a2       ;point a2 past last plane
  12477.  moveq #0,d0
  12478.  move.b bm_Depth(a3),d0
  12479.  lsl.l #2,d0
  12480.  add.l d0,a2
  12481.  
  12482. .kill:                     ;** 2nd entry point - a2 points past last plane
  12483.  add.w #bm_Planes,a3
  12484.  cmpa.l a3,a2              ;go if all deallocated
  12485.  sub.w #bm_Planes,a3
  12486.  beq.s .kldn
  12487.  move.l -(a2),a1           ;free bitplanes in reverse order
  12488.  move.l xxp_sysb(a4),a6
  12489.  jsr _LVOFreeVec(a6)
  12490.  bra .kill
  12491. .kldn:
  12492.  move.l a3,a1              ;deallocate bitmap itself
  12493.  jsr _LVOFreeVec(a6)
  12494.  rts
  12495.  
  12496.  
  12497. *>>>> put a bitmap to an ILBM file
  12498. ; D0,D1 = topleft  }these will be validated; D0 will be rounded up div by 8
  12499. ; D2,D3 = size     }either 0 for whole bmap; D2 will be rounded up div by 16
  12500. ; A0    = bitmap
  12501. ; makes CMAP from xxp_Screen colours)(none if bmap planes > screen planes)
  12502. ; fname in buff
  12503. ; returns D0=0 if bad, error in xxp_errn
  12504. TLPutilbm:
  12505.  movem.l d0-d7/a0-a6,-(a7) ;save all exc d0
  12506.  movem.l d0-d3,-(a7)       ;working values of d0-d3
  12507.  move.l a0,a5              ;a5 = bitmap
  12508.  bsr TLBusy
  12509.  clr.l xxp_errn(a4)
  12510.  move.w (a0),d4            ;* validate d0-d3 (in stack working vals)
  12511.  lsl.w #3,d4               ;d4=bitmap width in pixels
  12512.  tst.w d2
  12513.  bne.s .val1               ;go if d2<>0
  12514.  move.w d4,d2              ;if d2=0, use bitmap width
  12515. .val1:
  12516.  add.w #15,d2              ;make sure d2 divisible by 16
  12517.  and.w #$FFF0,d2
  12518.  bne.s .val2
  12519.  moveq #16,d2              ;(min width 16)
  12520. .val2:
  12521.  cmp.w d4,d2               ;go if d2 <= bitmap width
  12522.  bls.s .val3
  12523.  move.w d4,d2              ;else, let d2 = bitmap width
  12524. .val3:
  12525.  move.w d2,8+2(a7)         ;store corrected d2
  12526.  sub.w d2,d4               ;d4 = max possible d0
  12527.  cmp.w d4,d0
  12528.  bls.s .val4               ;go if d0 <= max possible
  12529.  move.w d4,d0              ;else, let d0 = max possible
  12530. .val4:
  12531.  move.w d0,0+2(a7)         ;store corrected d0
  12532.  move.w 2(a0),d4           ;d4 = bitmap height
  12533.  tst.w d3
  12534.  bne.s .val5               ;go if input d3 <> 0
  12535.  move.w d4,d3              ;else, let d3 = bitmap height
  12536. .val5:
  12537.  cmp.w d4,d3               ;go if d3 <= bitmap height
  12538.  bls.s .val6
  12539.  move.w d4,d3              ;else d3 = bitmap height
  12540. .val6:
  12541.  move.w d3,12+2(a7)        ;store corrected d3
  12542.  sub.w d3,d4               ;d4 = max possible d1
  12543.  cmp.w d4,d1
  12544.  bls.s .val7               ;go if d1 <= max possible
  12545.  move.w d4,d1              ;else, let d1 = max possible
  12546. .val7:
  12547.  move.w d1,4+2(a7)         ;store corrected d1
  12548.  moveq #0,d7               ;* get colour map from screen
  12549.  move.b bm_Depth(a5),d7    ;d7 = no. of planes in bitmap
  12550.  moveq #1,d6
  12551.  lsl.w d7,d6               ;d6 = no. of colours
  12552.  move.l d6,d0
  12553.  mulu #12,d0               ;(colour map has 12 bytes per colour)
  12554.  move.l xxp_sysb(a4),a6
  12555.  moveq #MEMF_PUBLIC,d1
  12556.  jsr _LVOAllocVec(a6)
  12557.  move.l d0,a3              ;a3 = mem for colour map (0 if none)
  12558.  tst.l d0
  12559.  beq .bad0
  12560.  move.l xxp_Screen(a4),a1  ;get screen colours into colour map
  12561.  add.l #sc_ViewPort,a1
  12562.  move.l vp_ColorMap(a1),a0 ;a0=colour map
  12563.  move.l a3,a1              ;a1=table in stack
  12564.  moveq #0,d0               ;get from colour 0
  12565.  move.l d6,d1              ;get no. of colours
  12566.  move.l xxp_gfxb(a4),a6
  12567.  jsr _LVOGetRGB32(a6)      ;get CMAP data from xxp_Screen
  12568.  move.l a3,a0              ;a3 gets RGB32 data
  12569.  move.l a3,a1              ;a1 puts in CMP format
  12570.  move.w d6,d1
  12571.  subq.w #1,d1
  12572. .cmap:
  12573.  move.l (a0)+,d0
  12574.  move.b d0,(a1)+
  12575.  move.l (a0)+,d0
  12576.  move.b d0,(a1)+
  12577.  move.l (a0)+,d0
  12578.  move.b d0,(a1)+
  12579.  dbra d1,.cmap
  12580.  move.l a1,d5              ;d5 = bytes in CMAP
  12581.  sub.l a3,d5
  12582.  addq.w #3,d5              ;round d5 up to nearest longword
  12583.  and.w #$FFFC,d5
  12584.  move.w 8+2(a7),d4         ;d4 = bytes in BODY
  12585.  lsr.w #3,d4
  12586.  mulu d7,d4
  12587.  mulu 12+2(a7),d4
  12588.  bsr TLOpenwrite           ;* open file
  12589.  beq .bad1                 ;bad if can't
  12590.  move.l a4,a0              ;* create header in buff
  12591.  move.l #'FORM',(a0)+      ; 0
  12592.  move.l #48,(a0)           ; 4  next 40 + BODY header = 48
  12593.  add.l d4,(a0)             ;    + bytes in BODY
  12594.  add.l d5,(a0)+            ;    + bytes in CMAP
  12595.  move.l #'ILBM',(a0)+      ; 8
  12596.  move.l #'BMHD',(a0)+      ; 12
  12597.  move.l #20,(a0)+          ; 16
  12598.  move.w 8+2(a7),(a0)+      ; 20 width
  12599.  move.w 12+2(a7),(a0)+     ;    height
  12600.  clr.l (a0)+               ; 24 null posn
  12601.  move.b d7,(a0)+           ; 28 planes
  12602.  clr.b (a0)+               ;    null masking
  12603.  clr.w (a0)+               ;    null compression,pad
  12604.  clr.w (a0)+               ; 32 null transparent
  12605.  move.w #$0A0B,(a0)+       ;    nominal aspect ration
  12606.  move.l 20(a4),(a0)+       ; 36 page size = pic size
  12607.  move.l #'CMAP',(a0)+      ; 40
  12608.  move.l d5,(a0)+           ; 44 CMAP size
  12609.  move.l a4,d2
  12610.  moveq #48,d3              ;* send the above 48 bytes
  12611.  bsr TLWritefile
  12612.  beq .bad2
  12613.  move.l a3,d2              ;* send CMAP
  12614.  move.l d5,d3
  12615.  bsr TLWritefile
  12616.  beq .bad2
  12617.  move.l #'BODY',(a4)       ;* send BODY header
  12618.  move.l d4,4(a4)
  12619.  move.l a4,d2
  12620.  moveq #8,d3
  12621.  bsr TLWritefile
  12622.  beq .bad2
  12623.  moveq #0,d4
  12624.  move.w bm_BytesPerRow(a5),d4 ;* send BODY
  12625.  mulu 4+2(a7),d4
  12626.  moveq #0,d5
  12627.  move.w 0+2(a7),d5
  12628.  lsr.w #3,d5
  12629.  add.l d5,d4               ;d4 = displacement (bytesperrow*ypos + xpos/8)
  12630.  move.w 12+2(a7),d5
  12631.  subq.w #1,d5              ;d5 counts rows
  12632. .row:
  12633.  move.l a5,a0              ;a0 gets planes
  12634.  add.w #bm_Planes,a0
  12635.  move.w d7,d6              ;d6 counts planes
  12636.  subq.w #1,d6
  12637. .plan:
  12638.  move.l (a0)+,d2           ;get plane
  12639.  add.l d4,d2               ;add disp
  12640.  moveq #0,d3
  12641.  move.w 8+2(a7),d3         ;send width/8 bytes
  12642.  lsr.w #3,d3
  12643.  bsr TLWritefile
  12644.  beq .bad2
  12645.  dbra d6,.plan
  12646.  add.w bm_BytesPerRow(a5),d4 ;bump disp after each row
  12647.  dbra d5,.row
  12648. .good:
  12649.  moveq #-1,d0              ;D0<>0 if ok
  12650.  bra.s .wrap
  12651. .bad0:                     ;* out of public memory (unlikely)
  12652.  moveq #1,d0
  12653.  bra.s .bad
  12654. .bad1:                     ;* can't open file
  12655.  moveq #4,d0
  12656.  bra.s .bad
  12657. .bad2:                     ;* can't write file
  12658.  moveq #6,d0
  12659. .bad:
  12660.  move.l d0,xxp_errn(a4)    ;set error code (0 if good)
  12661.  moveq #0,d0               ;D0=0 if bad
  12662. .wrap:
  12663.  add.w #16,a7              ;discard working values of d0-d3
  12664.  move.l d0,16(a7)          ;return d0 value
  12665.  move.l a3,d0
  12666.  beq.s .done               ;free the bitmap memory (if any)
  12667.  move.l xxp_sysb(a4),a6
  12668.  move.l d0,a1
  12669.  jsr _LVOFreeVec(a6)
  12670. .done:
  12671.  bsr TLClosefile           ;close file if open
  12672.  bsr TLUnbusy
  12673.  tst.l (a0)                ;EQ if bad
  12674.  movem.l (a7)+,d0-d7/a0-a6
  12675.  rts
  12676.  
  12677.  
  12678. *>>>> resize a region of a rastport
  12679.  
  12680. ; D0,D1 = topleft
  12681. ; D2,D3 = old size
  12682. ; D4,D5 = new size
  12683. ; D6    = pen to fill exposed blank areas
  12684. ; A0    = rastport (if bit 31 of d0 set, else 0)
  12685.  
  12686. TLResize:
  12687.  movem.l d0-d7/a0-a6,-(a7) ;save all regs
  12688.  clr.l xxp_errn(a4)
  12689.  move.l xxp_gfxb(a4),a6
  12690.  
  12691.  sub.l a5,a5               ;a5 = 0 if not to window
  12692.  move.l a0,a3              ;a3 = rastport to draw to
  12693.  tst.l d1
  12694.  bmi.s .rpor
  12695.  move.l xxp_AcWind(a4),a5
  12696.  move.l xxp_WPort(a5),a3
  12697.  bclr #31,d1
  12698.  add.w xxp_LeftEdge(a5),d0 ;if window, offset d0,d1 by edges
  12699.  add.w xxp_TopEdge(a5),d1
  12700. .rpor:
  12701.  
  12702.  movem.l d0-d1,-(a7)       ;set pen & drawmode for clearing exposed areas
  12703.  move.l d6,d0
  12704.  move.l a3,a1
  12705.  jsr _LVOSetAPen(a6)
  12706.  moveq #RP_JAM2,d0
  12707.  move.l 8(a7),a0
  12708.  jsr _LVOSetDrMd(a6)
  12709.  movem.l (a7)+,d0-d1
  12710.  
  12711.  movem.l d0-d5,-(a7)       ;keep d0-d5 for vert
  12712.  
  12713.  move.l a3,a0              ;regs for ClipBlit
  12714.  move.l a3,a1
  12715.  sub.l a2,a2
  12716.  
  12717.  cmp.w d2,d4               ;* horz: go if wider/narrower/same width
  12718.  beq .hzeq
  12719.  bcc .hzgt
  12720.  
  12721. .hzlt:                     ;* shrink horizontal
  12722.  move.l d2,d6
  12723.  subq.w #1,d6              ;d6 = old width - 1
  12724.  move.l d4,d7
  12725.  subq.w #1,d7              ;d7 = new width - 1
  12726.  move.l d3,d5              ;d5 = (old) height
  12727.  move.w d6,d3              ;d3 counts through old width
  12728.  moveq #0,d4               ;d4 moves along old xpos
  12729.  moveq #-1,d2              ;d2 = previous new xpos
  12730.  
  12731. .lhnx:
  12732.  movem.l d0-d7/a0-a1,-(a7)
  12733.  move.l d4,d2              ;d4 = old xpos
  12734.  mulu d7,d2
  12735.  divu d6,d2                ;d2 = new xpos
  12736.  and.l #$0000FFFF,d2
  12737.  move.w #$00C0,d6          ;minterm = jam 2
  12738.  cmp.l 8(a7),d2
  12739.  bne.s .lhj2               ;go if new xpos <> previous new xpos
  12740.  move.w #$00E0,d6          ;else, minterm = jam 1
  12741. .lhj2:
  12742.  move.l d2,8(a7)           ;note new xpos for next time
  12743.  cmp.l d2,d4
  12744.  beq.s .lhfw               ;go if old xpos = new xpos
  12745.  add.l d0,d2               ;d2 = to xpos
  12746.  add.l d4,d0               ;d0 = from ypos
  12747.  moveq #1,d4               ;copy a single file
  12748.  move.l d1,d3              ;d3 = to ypos
  12749.  moveq #-1,d7              ;copy all planes
  12750.  cmpa.w #0,a5
  12751.  beq.s .clp0
  12752.  bsr TLWCheck
  12753.  bne .bad
  12754. .clp0:
  12755.  jsr _LVOClipBlit(a6)
  12756.  
  12757. .lhfw:
  12758.  movem.l (a7)+,d0-d7/a0-a1
  12759.  addq.w #1,d4              ;bump old xpos
  12760.  dbra d3,.lhnx             ;until all done
  12761.  
  12762.  add.w d7,d0               ;clear exposed area: d0 = its lhs
  12763.  addq.l #1,d0
  12764.  sub.l d7,d6               ;d2 = its rhs
  12765.  move.l d0,d2
  12766.  add.w d6,d2
  12767.  subq.w #1,d2
  12768.  move.l d5,d3
  12769.  add.w d1,d3               ;d1 = its top
  12770.  subq.w #1,d3              ;d3 = its bot
  12771.  move.l a0,-(a7)
  12772.  cmp.w #0,a5
  12773.  beq.s .clp1
  12774.  bsr TLWCheck
  12775.  bne .bad
  12776. .clp1:
  12777.  jsr _LVORectFill(a6)      ;fill exposed area with BgPen
  12778.  move.l (a7)+,a0
  12779.  bra .hzeq
  12780.  
  12781. .hzgt:                     ;* expand horizontal
  12782.  move.l d2,d6
  12783.  subq.w #1,d6              ;d6 = old width - 1
  12784.  move.l d4,d7
  12785.  subq.w #1,d7              ;d7 = new width - 1
  12786.  move.l d3,d5              ;d5 = (old) height
  12787.  move.l d1,d3              ;d3 = ypos to
  12788.  move.l d7,d4              ;d4 counts along new xpos
  12789.  
  12790. .mhnx:
  12791.  movem.l d0-d7/a0-a1,-(a7)
  12792.  move.l d4,d2              ;d2 = old xpos to put to new xpos
  12793.  mulu d6,d2
  12794.  divu d7,d2
  12795.  and.l #$0000FFFF,d2
  12796.  cmp.w d2,d4               ;go if same
  12797.  beq.s .mhfw
  12798.  add.w d0,d4
  12799.  add.w d2,d0               ;d0 = from xpos
  12800.  move.w d4,d2              ;d2 = to xpos
  12801.  moveq #1,d4
  12802.  move.w #$00C0,d6          ;d6 = JAM2
  12803.  moveq #-1,d7
  12804.  cmp.w #0,a5
  12805.  beq.s .clp2
  12806.  bsr TLWCheck
  12807.  bne .bad
  12808. .clp2:
  12809.  jsr _LVOClipBlit(a6)      ;tfr the line
  12810. .mhfw:
  12811.  movem.l (a7)+,d0-d7/a0-a1
  12812.  subq.l #1,d4              ;until all done
  12813.  bpl .mhnx
  12814.  
  12815. .hzeq:
  12816.  
  12817.  movem.l (a7)+,d0-d5       ;restore d0-d5 from before horz
  12818.  
  12819.  cmp.w d3,d5               ;* vertical: compare new height - old height
  12820.  beq .quit
  12821.  bcc .vtgt
  12822.  
  12823. .vtlt:                     ;* reduce vertical
  12824.  move.l d3,d6
  12825.  subq.w #1,d6              ;d6 = old height - 1
  12826.  move.l d5,d7
  12827.  subq.w #1,d7              ;d7 = new height - 1         d4 = (new) width
  12828.  move.w d6,d2              ;d3 counts through old height
  12829.  moveq #0,d5               ;d5 moves along old ypos
  12830.  moveq #-1,d3              ;d3 = previous new ypos
  12831.  
  12832. .lvnx:
  12833.  movem.l d0-d7/a0-a1,-(a7)
  12834.  move.l d5,d3              ;d5 = old ypos
  12835.  mulu d7,d3
  12836.  divu d6,d3                ;d3 = new xpos
  12837.  and.l #$0000FFFF,d3
  12838.  move.w #$00C0,d6          ;minterm = jam 2
  12839.  cmp.l 12(a7),d3
  12840.  bne.s .lvj2               ;go if new ypos <> previous new ypos
  12841.  move.w #$00E0,d6          ;else, minterm = jam 1
  12842. .lvj2:
  12843.  move.l d3,12(a7)          ;note new ypos for next time
  12844.  cmp.l d3,d5
  12845.  beq.s .lvfw               ;go if old ypos = new ypos
  12846.  add.l d1,d3               ;d3 = to ypos
  12847.  add.l d5,d1               ;d1 = from ypos
  12848.  moveq #1,d5               ;copy a single rank
  12849.  move.l d0,d2              ;d2 = to xpos
  12850.  moveq #-1,d7              ;copy all planes
  12851.  cmp.w #0,a5
  12852.  beq.s .clp3
  12853.  bsr TLWCheck
  12854.  bne .bad
  12855. .clp3:
  12856.  jsr _LVOClipBlit(a6)
  12857. .lvfw:
  12858.  movem.l (a7)+,d0-d7/a0-a1
  12859.  
  12860.  addq.w #1,d5              ;bump old ypos
  12861.  dbra d2,.lvnx             ;until all done
  12862.  
  12863.  add.w d7,d1               ;clear exposed area: d1 = its top
  12864.  addq.l #1,d1
  12865.  sub.l d7,d6               ;d3 = its bot
  12866.  move.l d1,d3
  12867.  add.w d6,d3
  12868.  subq.w #1,d3
  12869.  move.l d4,d2
  12870.  add.w d0,d2               ;d0 = its lhs
  12871.  subq.w #1,d2              ;d2 = its rhs
  12872.  move.l a0,-(a7)
  12873.  cmp.w #0,d5
  12874.  beq.s .clp4
  12875.  bsr TLWCheck
  12876.  bne.s .bad
  12877. .clp4:
  12878.  jsr _LVORectFill(a6)      ;fill exposed area with BgPen
  12879.  move.l (a7)+,a0
  12880.  bra .quit
  12881.  
  12882. .vtgt:                     ;* expand vertical
  12883.  move.l d3,d6
  12884.  subq.w #1,d6              ;d6 = old height - 1
  12885.  move.l d5,d7
  12886.  subq.w #1,d7              ;d7 = new height - 1       d4 = (new) width
  12887.  move.l d0,d2              ;d2 = xpos to
  12888.  move.l d7,d5              ;d5 counts along new ypos
  12889.  
  12890. .mvnx:
  12891.  movem.l d0-d7/a0-a1,-(a7)
  12892.  move.l d5,d3              ;d3 = old ypos to put to new ypos
  12893.  mulu d6,d3
  12894.  divu d7,d3
  12895.  and.l #$0000FFFF,d3
  12896.  cmp.w d3,d5               ;go if same
  12897.  beq.s .mvfw
  12898.  add.w d1,d5
  12899.  add.w d3,d1               ;d1 = from ypos
  12900.  move.w d5,d3              ;d3 = to ypos
  12901.  moveq #1,d5
  12902.  move.w #$00C0,d6          ;d6 = JAM2
  12903.  moveq #-1,d7
  12904.  cmp.w #0,a5
  12905.  beq.s .clp5
  12906.  bsr TLWCheck
  12907.  bne.s .bad
  12908. .clp5:
  12909.  jsr _LVOClipBlit(a6)      ;tfr the line
  12910. .mvfw:
  12911.  movem.l (a7)+,d0-d7/a0-a1
  12912.  
  12913.  subq.l #1,d5              ;until all done
  12914.  bpl .mvnx
  12915.  bra.s .quit
  12916.  
  12917. .bad:                      ;bad if window resized
  12918.  move.w #35,xxp_errn+2(a4)
  12919.  
  12920. .quit:
  12921.  movem.l (a7)+,d0-d7/a0-a6
  12922.  tst.l xxp_errn(a4)
  12923.  eori.w #-1,CCR            ;EQ, errn<> if bad (i.e. window resized)
  12924.  rts
  12925.  
  12926.  
  12927. *>>>> draw an ellipse - clipped if required
  12928.  
  12929. ; D0 = x centre  (bit 31 of D0 set if solid, else outline)
  12930. ; D1 = y centre  (bit 31 of D1 set if rastport, else use AcWind)
  12931. ; D2 = x radius
  12932. ; D3 = y radius
  12933. ; D4 = xmin
  12934. ; D5 = ymin
  12935. ; D6 = xmax
  12936. ; D7 = ymax
  12937. ; A0 = rastport if D1 bit 31 set, else ignored
  12938.  
  12939. TLEllipse:
  12940.  
  12941. ; stack offsets
  12942. .xval: equ 60              ;xval for dots
  12943. .yval: equ 64              ;yval for dots
  12944. .a2b2: equ 68              ;a^2 * b^2 } for calulating dot posns
  12945. .a2x2: equ 72              ;a^2 * 2   }
  12946. .aint: equ 76
  12947. .ind0: equ 80              ;input d0
  12948. .ind1: equ 84              ;input d1
  12949.  
  12950.  movem.l d0-d1,-(a7)       ;save input d0 prior to modifying it
  12951.  clr.l xxp_errn(a4)
  12952.  bclr #31,d0               ;clear bit 31 of input d0,d1
  12953.  bclr #31,d1
  12954.  sub.w #20,a7              ;a7+60 = .xval  etc.
  12955.  movem.l d0-d7/a0-a6,-(a7) ;save all (60 bytes)
  12956.  
  12957.  move.l xxp_gfxb(a4),a6    ;if window, xxp_FrontPen in its rastport
  12958.  tst.l .ind1(a7)
  12959.  bmi.s .penc
  12960.  move.l xxp_AcWind(a4),a5
  12961.  move.l xxp_WPort(a5),a1
  12962.  moveq #0,d0
  12963.  move.b xxp_FrontPen(a5),d0
  12964.  jsr _LVOSetAPen(a6)
  12965. .penc:
  12966.  
  12967.  sub.l a3,a3               ;a3 = 0 if solid, else a3 = 1
  12968.  tst.l .ind0(a7)
  12969.  bmi.s .redi
  12970.  addq.l #1,a3
  12971.  
  12972. .redi:
  12973.  move.l 8(a7),d2
  12974.  move.l 12(a7),d3
  12975.  
  12976.  moveq #-1,d7              ;d7 = scale
  12977.  move.l d2,d6
  12978.  mulu d3,d6                ;d6 = X * Y (scale so X * Y < $10000)
  12979.  swap d6
  12980.  lsl.w #1,d6               ;d6 = upper word of product * 2
  12981. .scal:
  12982.  addq.l #1,d7              ;d7 = scale factor (0+)
  12983.  lsr.w #1,d6               ;shift upper word of product until clear
  12984.  bne .scal
  12985.  lsr.l d7,d2               ;scale d2 down d7 places, so X * Y < $10000
  12986.  
  12987.  move.l d2,d0              ;d0 = a
  12988.  move.l d3,d1              ;d1 = b
  12989.  
  12990.  cmpa.w #0,a3
  12991.  bne.s .sw0
  12992.  exg d0,d1                 ;if a3 = 0, switch a,b
  12993. .sw0
  12994.  move.l d0,.aint(a7)
  12995.  
  12996.  clr.l .xval(a7)
  12997.  subq.l #1,.xval(a7)       ;xval = -1
  12998.  move.l d1,.yval(a7)       ;yval = b
  12999.  move.l d1,d6
  13000.  mulu d1,d6
  13001.  move.l d6,d4              ;d4 = +b²
  13002.  move.l d6,d5              ;d5 = -3b²
  13003.  mulu #3,d5
  13004.  neg.l d5
  13005.  lsl.l #1,d6               ;d6 = 2b²
  13006.  move.l d0,d3              ;d1 = a²b²    (d3 = ab)
  13007.  mulu d1,d3
  13008.  move.l d3,d1
  13009.  mulu d3,d1
  13010.  move.l d1,.a2b2(a7)       ;save a²b²
  13011.  mulu d0,d3
  13012.  lsl.l #1,d3               ;(d3 = 2ba²)
  13013.  move.l d0,d2
  13014.  mulu d0,d2
  13015.  add.l d2,d3               ;d3 = 2ba²+a²
  13016.  lsl.l #1,d2               ;(d2 = 2a²)
  13017.  move.l d2,.a2x2(a7)       ;save 2a²
  13018.  move.l d1,d2              ;d2 = b²a²
  13019.  
  13020. .dotx:                     ;* to next xdot
  13021.  addq.l #1,.xval(a7)       ;xval = 0        1             2
  13022.  add.l d6,d5               ;d5   = -b²      b²            3b²
  13023.  add.l d5,d4               ;d4   = 0        1b²           4b²
  13024.  
  13025. .doty:                     ;find corresponding ydot
  13026.  move.l .a2b2(a7),d0       ;is yval too big?
  13027.  sub.l d4,d0               ;(equation of ellipse: a²b²-b²x²-a²y²=0)
  13028.  sub.l d2,d0
  13029.  bcc.s .dotr               ;not too big, accept
  13030.  subq.l #1,.yval(a7)       ;yval = b        b-1           b-2
  13031.  bmi.s .dotf               ;go if yval underflow (can't happen?)
  13032.  sub.l .a2x2(a7),d3        ;d3   = 2ba²+a²  2ba²-a²       2ba²-3a²
  13033.  sub.l d3,d2               ;d2   = b²a²     b²a²-2ba²+a²  b²a²-4ba²+4a²
  13034.  bra .doty
  13035. .dotf:
  13036.  addq.l #1,.yval(a7)
  13037.  
  13038. .dotr:                     ;* we have found our next coordinate pair....
  13039.  move.l .xval(a7),d0       ;d0 = xval
  13040.  move.l .yval(a7),d1       ;d1 = yval
  13041.  lsl.l d7,d0               ;scale xval
  13042.  movem.l d0-d7/a0-a1,-(a7) ;stack increases by 40 bytes
  13043.  
  13044.  move.l d0,d6              ;d6 = x coord
  13045.  move.l d1,d7              ;d7 = y coord
  13046.  
  13047.  cmpa.w #0,a3              ;if a3 = 0, switch coords
  13048.  bne.s .sw1
  13049.  exg d6,d7
  13050. .sw1:
  13051.  
  13052.  move.l 40+16(a7),d2       ;d2 = xmin
  13053.  move.l 40+20(a7),d3       ;d3 = ymin
  13054.  move.l 40+24(a7),d4       ;d4 = xmax
  13055.  move.l 40+28(a7),d5       ;d5 = ymax
  13056.  
  13057.  move.l 40+0(a7),d0        ;* lower right point
  13058.  move.l 40+4(a7),d1
  13059.  add.l d6,d0
  13060.  add.l d7,d1
  13061.  bsr .lims                 ;check limits
  13062.  tst.l 40+.ind1(a7)
  13063.  bpl.s .slx1a              ;go if window
  13064.  move.l 40+32(a7),a1
  13065.  tst.l 40+.ind0(a7)
  13066.  bpl.s .slx1b              ;  rastport: go if outline
  13067.  bra.s .slx1c              ;  rastport: go if solid
  13068. .slx1a:
  13069.  move.l xxp_AcWind(a4),a5
  13070.  move.l xxp_WPort(a5),a1
  13071.  add.w xxp_LeftEdge(a5),d0 ;  window: add top,left offsets
  13072.  add.w xxp_TopEdge(a5),d1
  13073.  tst.l 40+.ind0(a7)        ;  window: go if solid
  13074.  bmi.s .slx1c
  13075.  bsr TLWCheck              ;  window: bad if resized
  13076.  bne .bad
  13077. .slx1b:
  13078.  jsr _LVOWritePixel(a6)    ;write lh pixel (outline)
  13079.  bra.s .slx1d
  13080. .slx1c:
  13081.  jsr _LVOMove(a6)          ;move to left (solid)
  13082. .slx1d:
  13083.  
  13084.  move.l 40+0(a7),d0        ;* lower right pixel / row
  13085.  move.l 40+4(a7),d1
  13086.  sub.l d6,d0
  13087.  bcc.s .scy2
  13088.  moveq #0,d0
  13089. .scy2:
  13090.  add.l d7,d1
  13091.  bsr .lims
  13092.  tst.l 40+.ind1(a7)
  13093.  bpl.s .slx3a
  13094.  move.l 40+32(a7),a1
  13095.  tst.l 40+.ind0(a7)
  13096.  bpl.s .slx3b
  13097.  bra.s .slx3c
  13098. .slx3a:
  13099.  move.l xxp_AcWind(a4),a5
  13100.  move.l xxp_WPort(a5),a1
  13101.  add.w xxp_LeftEdge(a5),d0
  13102.  add.w xxp_TopEdge(a5),d1
  13103.  tst.l 40+.ind0(a7)
  13104.  bmi.s .slx3c
  13105.  bsr TLWCheck
  13106.  bne .bad
  13107. .slx3b:
  13108.  jsr _LVOWritePixel(a6)
  13109.  bra.s .slx3d
  13110. .slx3c:
  13111.  jsr _LVODraw(a6)
  13112. .slx3d:
  13113.  
  13114.  move.l 40+0(a7),d0        ;* upper right pixel/row
  13115.  move.l 40+4(a7),d1
  13116.  sub.l d6,d0
  13117.  bcc.s .scy3
  13118.  moveq #0,d0
  13119. .scy3:
  13120.  sub.l d7,d1
  13121.  bcc.s .scy4
  13122.  moveq #0,d1
  13123. .scy4:
  13124.  bsr .lims
  13125.  tst.l 40+.ind1(a7)
  13126.  bpl.s .slx4a
  13127.  move.l 40+32(a7),a1
  13128.  tst.l 40+.ind0(a7)
  13129.  bpl.s .slx4b
  13130.  bra.s .slx4d
  13131. .slx4a:
  13132.  move.l xxp_AcWind(a4),a5
  13133.  move.l xxp_WPort(a5),a1
  13134.  add.w xxp_LeftEdge(a5),d0
  13135.  add.w xxp_TopEdge(a5),d1
  13136.  tst.l 40+.ind0(a7)
  13137.  bmi.s .slx4b
  13138.  bsr TLWCheck
  13139.  bne .bad
  13140.  jsr _LVOWritePixel(a6)
  13141.  bra.s .slx4e
  13142. .slx4b:
  13143.  bsr TLWCheck
  13144.  bne.s .bad
  13145. .slx4d:
  13146.  jsr _LVOMove(a6)
  13147. .slx4e:
  13148.  
  13149.  move.l 40+0(a7),d0        ;* upper right pixel
  13150.  move.l 40+4(a7),d1
  13151.  add.l d6,d0
  13152.  sub.l d7,d1
  13153.  bcc.s .scy1
  13154.  moveq #0,d1
  13155. .scy1:
  13156.  bsr .lims
  13157.  tst.l 40+.ind1(a7)
  13158.  bpl.s .slx2a
  13159.  move.l 40+32(a7),a1
  13160.  tst.l 40+.ind0(a7)
  13161.  bpl.s .slx2b
  13162.  bra.s .slx2d
  13163. .slx2a:
  13164.  move.l xxp_AcWind(a4),a5
  13165.  move.l xxp_WPort(a5),a1
  13166.  add.w xxp_LeftEdge(a5),d0
  13167.  add.w xxp_TopEdge(a5),d1
  13168.  tst.l 40+.ind0(a7)
  13169.  bmi.s .slx2c
  13170.  bsr TLWCheck
  13171.  bne.s .bad
  13172. .slx2b:
  13173.  jsr _LVOWritePixel(a6)
  13174.  bra.s .slx2e
  13175. .slx2c:
  13176.  bsr TLWCheck
  13177.  bne.s .bad
  13178. .slx2d:
  13179.  jsr _LVODraw(a6)
  13180. .slx2e:
  13181.  
  13182. .skip:                     ;to next dot
  13183.  move.l .xval+40(a7),d0
  13184.  cmp.l .aint+40(a7),d0     ;all dots done? (x up to a)
  13185.  movem.l (a7)+,d0-d7/a0-a1
  13186.  bcc.s .skpc
  13187.  tst.l .yval(a7)           ;all dots done? (y down to 0)
  13188.  bgt .dotx                 ;no, find next coordinate pair
  13189.  
  13190. .skpc:
  13191.  subq.l #1,a3              ;dec a3
  13192.  cmpa.w #0,a3
  13193.  beq .redi                 ;continue if 2nd of 2 times thru
  13194.  bra.s .done               ;else done ok
  13195.  
  13196. .bad:                      ;bad if window resized
  13197.  movem.l (a7)+,d0-d7/a0-a1
  13198.  move.w #35,xxp_errn+2(a4)
  13199.  
  13200. .done:
  13201.  movem.l (a7)+,d0-d7/a0-a6
  13202.  add.w #20,a7
  13203.  movem.l (a7)+,d0-d1
  13204.  tst.l xxp_errn(a4)
  13205.  eori.w #-1,CCR            ;EQ, xxp_errn<> if bad
  13206.  rts
  13207.  
  13208. .lims:                     ;** check d0,d1 within limits
  13209.  cmp.l d2,d0
  13210.  bcc.s .lim0
  13211.  move.l d2,d0
  13212. .lim0:
  13213.  cmp.l d0,d4
  13214.  bcc.s .lim1
  13215.  move.l d4,d0
  13216. .lim1:
  13217.  cmp.l d3,d1
  13218.  bcc.s .lim2
  13219.  move.l d3,d1
  13220. .lim2:
  13221.  cmp.l d1,d5
  13222.  bcc.s .lim3
  13223.  move.l d5,d1
  13224. .lim3:
  13225.  rts
  13226.  
  13227.  
  13228. *>>>> select a region within xxp_AcWind
  13229.  
  13230. ; D0 = minimum xpos
  13231. ; D1 = minimum ypos
  13232. ; D2 = maximum xpos
  13233. ; D3 = maximum ypos
  13234. ; A0 = 16 byte area for region (can be in xxp_buff)
  13235.  
  13236. ; Result in  D0 and (a0):
  13237. ;   D0: 0=cancelled   -1=ok
  13238. ;   If ok:
  13239. ;      4(a0) = top left xpos
  13240. ;      8(a0) = top left ypos
  13241. ;     12(a0) = bot right xpos
  13242. ;     16(a0) = bot right ypos
  13243.  
  13244. TLGetarea:
  13245.  sub.w #20,a7              ;box data at 60(a7)
  13246.  movem.l d0-d7/a0-a6,-(a7) ;save all except result in d0  (60 stack levels)
  13247.  move.l xxp_gfxb(a4),a6    ;a6 = gfx base
  13248.  move.l xxp_AcWind(a4),a5  ;a5 = active window
  13249.  moveq #0,d0
  13250.  move.b rp_DrawMode(a0),d0
  13251.  move.l d0,76(a7)          ;save initial draw mode
  13252.  moveq #RP_JAM2!RP_COMPLEMENT,d0 ;set draw mode to complement
  13253.  move.l xxp_WPort(a5),a1
  13254.  jsr _LVOSetDrMd(a6)
  13255. .wait:                     ;* wait for mousedown/Esc
  13256.  jsr _LVOWaitTOF(a6)       ;avoid busy wait
  13257.  move.l xxp_Window(a5),a1
  13258.  jsr TLMmess               ;get message
  13259.  beq .wait                 ;go if none
  13260.  move.l d4,d5
  13261.  and.l #IDCMP_NEWSIZE,d5
  13262.  bne .canc                 ;treat as cancel if newsize
  13263.  move.l d4,d5
  13264.  and.l #IDCMP_CLOSEWINDOW,d5
  13265.  bne .canc                 ;treat as cancel if close window
  13266.  move.l d4,d5
  13267.  and.l #IDCMP_VANILLAKEY,d5
  13268.  beq.s .wtcu               ;go if not vanilla key
  13269.  cmp.b #$1B,d0
  13270.  bne .wait                 ;ignore vanilla key unless Esc
  13271.  bra .canc                 ;treat Esc as cancel
  13272. .wtcu:
  13273.  move.l d4,d5
  13274.  and.l #IDCMP_MOUSEBUTTONS,d5
  13275.  beq .wait                 ;ignore if not mousebuttons
  13276.  cmp.w #SELECTDOWN,d0
  13277.  bne .wait                 ;ignore mousebuttons other than lmb down
  13278.  cmp.w 0+2(a7),d1
  13279.  bcs .wait                 ;ignore if pointer out of allowable area
  13280.  cmp.w 8+2(a7),d1
  13281.  bhi .wait
  13282.  cmp.w 4+2(a7),d2
  13283.  bcs .wait
  13284.  cmp.w 12+2(a7),d2
  13285.  bhi .wait
  13286.  clr.l 60(a7)              ;put data in box area, & init box
  13287.  move.w d1,62(a7)
  13288.  clr.l 64(a7)
  13289.  move.w d2,66(a7)
  13290.  clr.l 68(a7)
  13291.  move.w d1,70(a7)
  13292.  clr.l 72(a7)
  13293.  move.w d2,74(a7)
  13294.  bsr .draw
  13295. .cont:                     ;* wait for mouse up/Esc
  13296.  jsr _LVOWaitTOF(a6)       ;avoid busy wait
  13297.  move.l xxp_Window(a5),a1
  13298.  bsr TLMmess               ;any idcmp?
  13299.  bne.s .some               ;yes, go
  13300.  move.l xxp_Window(a5),a1  ;get pointer posn
  13301.  move.w wd_MouseX(a1),d0
  13302.  move.w wd_MouseY(a1),d1
  13303.  cmp.w 70(a7),d0           ;redo box if pointer has moved
  13304.  bne.s .move
  13305.  cmp.w 74(a7),d1
  13306.  beq .cont
  13307. .move:                     ;* pointer has moved
  13308.  cmp.w 62(a7),d0
  13309.  bcs .cont                 ;kill box & redo if pointer left or above box
  13310.  cmp.w 66(a7),d1
  13311.  bcs .cont
  13312.  cmp.w 8+2(a7),d0          ;ignore pointer if right or below box
  13313.  bhi .cont
  13314.  cmp.w 12+2(a7),d1
  13315.  bhi .cont
  13316.  bsr .draw                 ;undraw rectangle
  13317.  move.w d0,70(a7)
  13318.  move.w d1,74(a7)
  13319.  bsr .draw                 ;draw at new posn
  13320.  bra .cont                 ;& keep waiting
  13321. .some:
  13322.  move.l d4,d5
  13323.  and.l #IDCMP_NEWSIZE,d5
  13324.  bne .drcc                 ;treat newsize as cancel
  13325.  move.l d4,d5
  13326.  and.l #IDCMP_CLOSEWINDOW,d5
  13327.  bne .drcc                 ;treat closewindow as cancel
  13328.  move.l d4,d5
  13329.  and.l #IDCMP_VANILLAKEY,d5
  13330.  beq.s .smcu               ;go if not vanilla key
  13331.  cmp.b #$1B,d0
  13332.  bne .cont                 ;ignore if not Esc
  13333.  bra .drcc                 ;treat Esc as cancel
  13334. .smcu:
  13335.  move.l d4,d5
  13336.  and.l #IDCMP_MOUSEBUTTONS,d5
  13337.  beq .cont                 ;ignore if not mousebuttons
  13338.  cmp.w #SELECTUP,d0        ;ignore if not lmb up
  13339.  bne .cont
  13340.  bsr .draw                 ;erase the box
  13341.  cmp.w 62(a7),d1
  13342.  bcs .wait                 ;reject & retry if pointer above/left of topleft
  13343.  cmp.w 66(a7),d2
  13344.  bcs .wait
  13345.  move.l 32(a7),a0          ;get where to put result
  13346.  move.l 60(a7),(a0)        ;fill in result
  13347.  move.l 64(a7),4(a0)
  13348.  move.l 68(a7),8(a0)
  13349.  move.l 72(a7),12(a0)
  13350.  move.l #-1,(a7)           ;* good - signal d0=-1 in stack
  13351.  bra.s .done
  13352. .drcc:                     ;* undraw then cancel
  13353.  bsr .draw
  13354. .canc:                     ;* cancelled - signal d0=0 in stack
  13355.  clr.l (a7)
  13356. .done:
  13357.  move.l xxp_WPort(a5),a1   ;restore initial drawmode
  13358.  move.l 76(a7),d0
  13359.  jsr _LVOSetDrMd(a6)
  13360.  movem.l (a7)+,d0-d7/a0-a6
  13361.  add.w #20,a7
  13362.  rts
  13363. .draw:                     ;** complement box
  13364.  movem.l d0-d7/a0-a2,-(a7) ;save all (44 stack bytes)
  13365.  move.l xxp_WPort(a5),a2   ;a2 = rastport
  13366.  move.l 60+4+44+0(a7),d4   ;box from (d4,d5)-(d6,d7)
  13367.  move.l 60+4+44+4(a7),d5
  13368.  move.l 60+4+44+8(a7),d6
  13369.  move.l 60+4+44+12(a7),d7
  13370.  move.l a2,a1              ;top left
  13371.  move.l d4,d0
  13372.  move.l d5,d1
  13373.  jsr _LVOMove(a6)
  13374.  move.l a2,a1              ;top left to top right
  13375.  move.l d6,d0
  13376.  move.l d5,d1
  13377.  jsr _LVODraw(a6)
  13378.  cmp.l d5,d7               ;quit if height = 1
  13379.  beq.s .drqt
  13380.  move.l a2,a1              ;bot left
  13381.  move.l d4,d0
  13382.  move.l d7,d1
  13383.  jsr _LVOMove(a6)
  13384.  move.l a2,a1              ;bot left to bot right
  13385.  move.l d6,d0
  13386.  move.l d7,d1
  13387.  jsr _LVODraw(a6)
  13388.  addq.l #1,d5              ;down a line for side tops
  13389.  cmp.l d5,d7
  13390.  beq.s .drqt               ;quit if height = 2
  13391.  subq.l #1,d7              ;up a line for side bots
  13392.  move.l a2,a1              ;top left
  13393.  move.l d4,d0
  13394.  move.l d5,d1
  13395.  jsr _LVOMove(a6)
  13396.  move.l a2,a1              ;top left to bot left
  13397.  move.l d4,d0
  13398.  move.l d7,d1
  13399.  jsr _LVODraw(a6)
  13400.  cmp.l d4,d6               ;quit if width = 1
  13401.  beq.s .drqt
  13402.  move.l a2,a1              ;top right
  13403.  move.l d6,d0
  13404.  move.l d5,d1
  13405.  jsr _LVOMove(a6)
  13406.  move.l a2,a1              ;top right to bot right
  13407.  move.l d6,d0
  13408.  move.l d7,d1
  13409.  jsr _LVODraw(a6)
  13410.  addq.l #1,d4              ;right a line for left side 2nd pixel
  13411.  cmp.l d4,d6               ;quit if width = 2
  13412.  beq.s .drqt
  13413.  move.l a2,a1              ;top left
  13414.  move.l d4,d0
  13415.  move.l d5,d1
  13416.  jsr _LVOMove(a6)
  13417.  move.l a2,a1              ;top left to bot right
  13418.  move.l d4,d0
  13419.  move.l d7,d1
  13420.  jsr _LVODraw(a6)
  13421.  subq.l #1,d6              ;left a line for right side 2nd pixel
  13422.  cmp.l d4,d6               ;quit if width = 3
  13423.  beq.s .drqt
  13424.  move.l a2,a1              ;top right
  13425.  move.l d6,d0
  13426.  move.l d5,d1
  13427.  jsr _LVOMove(a6)
  13428.  move.l a2,a1              ;top right to bot right
  13429.  move.l d6,d0
  13430.  move.l d7,d1
  13431.  jsr _LVODraw(a6)
  13432. .drqt:
  13433.  movem.l (a7)+,d0-d7/a0-a2
  13434.  rts
  13435.  
  13436.  
  13437. *>>>> Put up a progress thermometer
  13438.  
  13439. ; On call:  D0 = progress
  13440. ;           D1 = total                    (must be <>0)
  13441. ;           D2 = 0:no text -1:text +1:%   (font,sty,tspc must be set)
  13442.  
  13443. TLProgress:
  13444.  movem.l d0-d7/a0-a6,-(a7) ;save all
  13445.  move.l d0,d7              ;d7 = progress
  13446.  move.l d1,d6              ;d6 = total
  13447.  
  13448.  move.l xxp_pref(a4),a1    ;prefs colours: yprg/yprg+2/yprg+3=back/frnt/Hg
  13449.  
  13450.  move.l xxp_prgd(a4),d0    ;draw thermometer bev
  13451.  move.l xxp_prgd+4(a4),d1
  13452.  move.l xxp_prgd+8(a4),d2
  13453.  move.l xxp_prgd+12(a4),d3
  13454.  bset #31,d0               ;(recessed)
  13455.  bsr TLReqbev
  13456.  
  13457.  bclr #31,d0               ;set d0-d3 to dims of inside area
  13458.  bset #29,d0
  13459.  addq.w #2,d0
  13460.  addq.w #1,d1
  13461.  subq.w #2,d3
  13462.  subq.w #4,d2
  13463.  
  13464.  move.l d7,d5              ;d4 = totl, d5 = prog
  13465.  move.l d6,d4              ;scale d4,d5 to word length if required
  13466. .scal:
  13467.  swap d4
  13468.  tst.w d4
  13469.  beq.s .scld
  13470.  swap d4
  13471.  lsr.l #1,d4
  13472.  lsr.l #1,d5
  13473.  bra .scal
  13474. .scld:
  13475.  swap d4
  13476.  
  13477.  mulu d5,d2                ;calculate Hg length in pixels
  13478.  divu d4,d2
  13479.  moveq #0,d4
  13480.  and.l #$0000FFFF,d2
  13481.  beq.s .bkgr
  13482.  
  13483.  move.b xxp_yprg+3(a1),d4  ;draw Hg
  13484.  bsr TLReqarea
  13485.  
  13486. .bkgr:                     ;draw background
  13487.  add.w d2,d0
  13488.  neg.w d2
  13489.  add.w xxp_prgd+8+2(a4),d2
  13490.  subq.w #4,d2
  13491.  ble.s .text
  13492.  move.b xxp_yprg(a1),d4
  13493.  bsr TLReqarea
  13494.  
  13495. .text:                     ;draw text
  13496.  tst.l 8(a7)               ;test input d2  (MI if text)
  13497.  beq .done                 ;go if none
  13498.  bpl.s .pcnt               ;go if %
  13499.  
  13500.  move.l d7,d0              ;put ascii of prog/totl in buff
  13501.  move.l a4,a0
  13502.  bsr TLHexasc
  13503.  move.b #'/',(a0)+
  13504.  move.l d6,d0
  13505.  bsr TLHexasc
  13506.  clr.b (a0)
  13507.  bra.s .prnt
  13508.  
  13509. .pcnt:                     ;put ascii of % in buff
  13510.  moveq #100,d0
  13511.  cmp.l d6,d7
  13512.  beq.s .pcnr               ;go if 100%
  13513.  
  13514. .pcns:
  13515.  swap d6                   ;scale to word size
  13516.  tst.w d6
  13517.  beq.s .pctr
  13518.  swap d6
  13519.  lsr.l #1,d6
  13520.  lsr.l #1,d7
  13521.  bra .pcns
  13522. .pctr:
  13523.  swap d6
  13524.  
  13525.  mulu d7,d0                ;calculate %
  13526.  divu d6,d0
  13527.  
  13528. .pcnr:
  13529.  move.l a4,a0              ;put ascii  in buff
  13530.  bsr TLHexasc
  13531.  move.b #'%',(a0)+
  13532.  clr.b (a0)
  13533.  
  13534. .prnt:
  13535.  move.l xxp_AcWind(a4),a5  ;set pen, jam1
  13536.  move.l xxp_IText(a5),-(a7)
  13537.  move.l xxp_FrontPen(a5),-(a7)
  13538.  move.l a4,xxp_IText(a5)
  13539.  move.b xxp_yprg+2(a1),xxp_FrontPen(a5)
  13540.  move.b #RP_JAM1,xxp_DrawMode(a5)
  13541.  
  13542.  bsr TLTszdo               ;get d4=width d6=height
  13543.  move.l xxp_prgd+12(a4),d1 ;centre vertically
  13544.  sub.w d6,d1
  13545.  bcs.s .txbd               ;go if won't fit
  13546.  addq.l #1,d1
  13547.  lsr.l #1,d1
  13548.  add.l xxp_prgd+4(a4),d1
  13549.  move.l xxp_prgd+8(a4),d0  ;centre horizontally
  13550.  sub.w d4,d0
  13551.  bcs.s .txbd               ;go if won't fit
  13552.  addq.l #1,d0
  13553.  lsr.l #1,d0
  13554.  add.l xxp_prgd(a4),d0
  13555.  bsr TLTrim                ;print text
  13556.  
  13557. .txbd:
  13558.  move.l (a7)+,xxp_FrontPen(a5)
  13559.  move.l (a7)+,xxp_IText(a5)
  13560.  
  13561. .done:
  13562.  movem.l (a7)+,d0-d7/a0-a6
  13563.  rts
  13564.  
  13565. *>>>> set/get the scroller(s) of the active window (D0=0 set, D0=-1 get)
  13566. ;       d1=-1vert 0both +1horz
  13567. TLWscroll:
  13568.  movem.l d0-d7/a0-a6,-(a7) ;save all
  13569.  move.l d1,d7              ;d7 = vert/both/horz
  13570.  move.l xxp_AcWind(a4),a5  ;a5 = active window's wsuw
  13571.  move.l xxp_scrl(a5),a3    ;a3 = xxp_scro structure
  13572.  move.l xxp_intb(a4),a6
  13573.  
  13574.  tst.l d0                  ;go if d0=-1 -> get
  13575.  bmi .get
  13576.  
  13577.  sub.w #28,a7              ;tags to set horizontal attributes
  13578.  tst.l d7
  13579.  bmi.s .sver               ;go if vert only
  13580.  
  13581.  move.l a7,a0
  13582.  move.l #PGA_Top,(a0)+     ;tag 1: PGA_Top     = GA_Top
  13583.  move.l xxp_hztp(a3),(a0)+
  13584.  move.l #PGA_Total,(a0)+   ;tag 2: PGA_Total   = GA_Total
  13585.  move.l xxp_hztt(a3),(a0)+
  13586.  move.l #PGA_Visible,(a0)+ ;tag 3: PGA_Visible = GA_Visible
  13587.  move.l xxp_hzvs(a3),(a0)+
  13588.  clr.l (a0)
  13589.  
  13590.  move.l xxp_scoh(a3),a0    ;set horizontal attribs
  13591.  move.l a7,a1
  13592.  jsr _LVOSetAttrsA(a6)
  13593.  
  13594.  move.l xxp_scoh(a3),a0    ;refresh horizontal slider
  13595.  move.l xxp_Window(a5),a1
  13596.  sub.l a2,a2
  13597.  moveq #1,d0
  13598.  jsr _LVORefreshGList(a6)
  13599.  tst.l d7                  ;go if vertical only
  13600.  bgt.s .sdon
  13601.  
  13602. .sver:
  13603.  move.l a7,a0              ;tags to set vertical attributes
  13604.  move.l #PGA_Top,(a0)+     ;tag 1: PGA_Top     = GA_Top
  13605.  move.l xxp_vttp(a3),(a0)+
  13606.  move.l #PGA_Total,(a0)+   ;tag 2: PGA_Total   = GA_Total
  13607.  move.l xxp_vttt(a3),(a0)+
  13608.  move.l #PGA_Visible,(a0)+ ;tag 3: PGA_Visible = GA_Visible
  13609.  move.l xxp_vtvs(a3),(a0)+
  13610.  clr.l (a0)
  13611.  
  13612.  move.l xxp_scov(a3),a0    ;set vertical attribs
  13613.  move.l a7,a1
  13614.  jsr _LVOSetAttrsA(a6)
  13615.  
  13616.  move.l xxp_scov(a3),a0    ;refresh vertical slider
  13617.  move.l xxp_Window(a5),a1
  13618.  sub.l a2,a2
  13619.  moveq #1,d0
  13620.  jsr _LVORefreshGList(a6)
  13621.  
  13622. .sdon:                     ;finished setting
  13623.  add.w #28,a7
  13624.  movem.l (a7)+,d0-d7/a0-a6
  13625.  rts
  13626.  
  13627. .get:                      ;* here if get
  13628.  move.l (a4),-(a7)
  13629.  tst.l d7
  13630.  bmi.s .gver               ;go if vert only
  13631.  move.l xxp_scoh(a3),a0
  13632.  move.l a4,a1
  13633.  move.l #PGA_Top,d0
  13634.  jsr _LVOGetAttr(a6)
  13635.  move.l (a4),xxp_hztp(a3)  ;get hztp
  13636.  tst.l d7
  13637.  bgt.s .gdon               ;go if horz only
  13638.  
  13639. .gver:
  13640.  move.l xxp_scov(a3),a0
  13641.  move.l a4,a1
  13642.  move.l #PGA_Top,d0
  13643.  jsr _LVOGetAttr(a6)
  13644.  move.l (a4),xxp_vttp(a3)  ;get vttp
  13645.  move.l (a7)+,(a4)
  13646.  
  13647. .gdon:
  13648.  movem.l (a7)+,d0-d7/a0-a6
  13649.  rts
  13650.  
  13651. *>>>> setup/draw/kill a tabs area
  13652. ; Setup:  D0 = strnum  D1 = min body width  D2 = body height
  13653. ; Draw:   D0 = 0    D1 = which to show (1+)   D2 = xpos  D3 = ypos
  13654. ; Kill:   D0 = 0    D1 = 0                    D2 = xpos  D3 = ypos
  13655. TLTabs:
  13656.  movem.l d0-d7/a0-a6,-(a7)
  13657.  move.l xxp_AcWind(a4),a5
  13658.  move.l xxp_IText(a5),-(a7)
  13659.  move.l xxp_FrontPen(a5),-(a7)
  13660.  move.w #$0103,xxp_FrontPen(a5)
  13661.  move.l a4,xxp_IText(a5)
  13662.  clr.l xxp_errn(a4)
  13663.  
  13664.  tst.l d0                  ;go if draw/kill
  13665.  beq .draw
  13666.  
  13667.  bsr TLStra0               ;* setup
  13668.  move.l a0,xxp_tbss(a4)    ;set string address
  13669.  moveq #0,d0               ;d0 counts strings
  13670.  moveq #0,d3               ;d3 finds max string len
  13671. .next:
  13672.  move.l a4,a1              ;put next string in buff
  13673.  addq.w #1,d0              ;bump string count
  13674. .tfr:
  13675.  move.b (a0)+,(a1)+        ;tfr to buff for getting len
  13676.  beq.s .tfrd
  13677.  cmp.b #'\',-1(a1)         ;\ or 0 delimits
  13678.  bne .tfr
  13679. .tfrd:
  13680.  clr.b -1(a1)              ;null delimit in buff
  13681.  bsr TLTsize
  13682.  cmp.w d3,d4               ;this len > max len so far?
  13683.  bcs.s .max
  13684.  move.w d4,d3              ;yes, put max so far in d3
  13685. .max
  13686.  tst.b -1(a0)              ;do next unless end of string reached
  13687.  bne .next
  13688.  addq.w #8,d3              ;minimum thumbtab width = max string width + 8
  13689.  addq.w #4,d6
  13690.  move.l d6,xxp_tblh(a4)    ;thumbtab height = font height + 4
  13691. .cry:                      ;get min tab wdth allowed by min body wdth
  13692.  move.l d1,d4              ; = ((bod wdth+8)-8)/numtabs rounded up
  13693.  add.l d0,d4
  13694.  subq.l #1,d4
  13695.  divu d0,d4
  13696.  and.l #$0000FFFF,d4       ;d4 = min tab width allowed by min body wdth
  13697.  cmp.w d4,d3
  13698.  bcc.s .maxw
  13699.  move.l d4,d3              ;take whichever is bigger
  13700. .maxw:
  13701.  move.l d3,xxp_tblw(a4)    ;set tab width
  13702.  mulu d0,d3
  13703.  addq.w #8,d3              ;total width = tabnum * tabwidth + 8
  13704.  move.l d3,xxp_tbbw(a4)    ;set total width
  13705.  add.l d6,d2
  13706.  addq.w #3,d2              ;total height = body ht + tab ht + 3
  13707.  move.l d2,xxp_tbbh(a4)    ;set total height
  13708.  bra .done                 ;all set up ok
  13709.  
  13710. .draw:                     ;go if kill
  13711.  
  13712.  move.l d1,d7              ;d7 = front tab num + 1
  13713.  beq .kill
  13714.  
  13715.  move.l d2,d0              ;* draw
  13716.  move.l d3,d1
  13717.  move.l xxp_tbbw(a4),d2
  13718.  move.l xxp_tbbh(a4),d3
  13719.  bsr TLReqarea             ;draw background, outline
  13720.  bsr TLReqbev
  13721.  
  13722.  move.l d1,d2              ;d1,d2 = top left
  13723.  move.l d0,d1
  13724.  moveq #0,d0
  13725.  bsr TLPict                ;draw top left corner
  13726.  
  13727.  move.l xxp_tbss(a4),a0    ;a0 scans thumbtab labels
  13728. .nexx:                     ;* complete next thumbtag...
  13729.  move.l a4,a1
  13730. .ntfr:
  13731.  move.b (a0)+,(a1)+        ;tfr label to buff
  13732.  beq.s .ntfd
  13733.  cmp.b #'\',-1(a1)
  13734.  bne .ntfr
  13735. .ntfd:
  13736.  clr.b -1(a1)              ;null delimit label
  13737.  move.l d1,d4              ;(save d1)
  13738.  move.l d1,d0
  13739.  move.l d2,d1
  13740.  addq.l #8,d0
  13741.  addq.l #2,d1
  13742.  bsr TLTrim                ;draw text at d1+8,d2+2
  13743.  move.l d4,d1              ;(restore d1)
  13744.  add.l xxp_tblw(a4),d1     ;bump to next tab lhs
  13745.  
  13746.  subq.w #1,d7
  13747.  bgt.s .tabp               ;go draw desc & horz to right of front tab
  13748.  bmi.s .tabm               ;go draw desc & horz to left of front tab
  13749. .tabe:
  13750.  moveq #1,d0
  13751. .tabd:
  13752.  tst.b -1(a0)              ;go if we are the rhs of the last tab
  13753.  beq .wrap
  13754.  bsr TLPict                ;else, draw under/over or over/under
  13755.  bra .nexx                 ;to next thumb tag
  13756.  
  13757. .tabp:                     ;here if left of front tab
  13758.  movem.l d1-d2,-(a7)       ;draw its descender
  13759.  move.l d1,d0
  13760.  move.l d2,d1
  13761.  addq.l #8,d1
  13762.  moveq #2,d2
  13763.  move.l xxp_tblh(a4),d3
  13764.  subq.l #8,d3
  13765.  moveq #2,d4
  13766.  bset #29,d0
  13767.  bsr TLReqarea
  13768.  movem.l (a7)+,d1-d2
  13769.  
  13770.  movem.l d1-d2,-(a7)       ;draw horizontal
  13771.  move.l d1,d0
  13772.  move.l d2,d1
  13773.  move.l xxp_tblw(a4),d2
  13774.  sub.l d2,d0
  13775.  add.l xxp_tblh(a4),d1
  13776.  subq.w #1,d1
  13777.  moveq #1,d3
  13778.  moveq #2,d4
  13779.  bset #29,d0
  13780.  bsr TLReqarea
  13781.  movem.l (a7)+,d1-d2
  13782.  
  13783.  moveq #2,d0               ;go draw under/over
  13784.  bra .tabd
  13785.  
  13786. .tabm:                     ;here if right of front tab
  13787.  movem.l d1-d2,-(a7)       ;draw its descender
  13788.  move.l d1,d0
  13789.  move.l d2,d1
  13790.  sub.l xxp_tblw(a4),d0
  13791.  addq.l #6,d0
  13792.  addq.l #8,d1
  13793.  moveq #2,d2
  13794.  move.l xxp_tblh(a4),d3
  13795.  subq.l #8,d3
  13796.  moveq #1,d4
  13797.  bset #29,d0
  13798.  addq.w #1,d7
  13799.  beq.s .tbmd
  13800.  subq.w #1,d3
  13801. .tbmd:
  13802.  subq.w #1,d7
  13803.  bsr TLReqarea
  13804.  movem.l (a7)+,d1-d2
  13805.  
  13806.  movem.l d1-d2,-(a7)       ;draw horizontal
  13807.  move.l d1,d0
  13808.  move.l d2,d1
  13809.  move.l xxp_tblw(a4),d2
  13810.  sub.l d2,d0
  13811.  addq.l #7,d0
  13812.  add.l xxp_tblh(a4),d1
  13813.  subq.l #1,d1
  13814.  moveq #1,d3
  13815.  moveq #2,d4
  13816.  bset #29,d0
  13817.  bsr TLReqarea
  13818.  movem.l (a7)+,d1-d2
  13819.  
  13820.  bra .tabe                 ;go draw over/under
  13821.  
  13822. .wrap:                     ;here if last tab
  13823.  moveq #3,d0               ;draw rhs of last tab
  13824.  bsr TLPict
  13825.  bra .done
  13826.  
  13827. .kill:                    ;* kill
  13828.  move.l d2,d0
  13829.  move.l d3,d1
  13830.  move.l xxp_tbbw(a4),d2
  13831.  move.l xxp_tbbh(a4),d3
  13832.  move.l (a7)+,xxp_FrontPen(a5)
  13833.  move.l xxp_FrontPen(a5),-(a7)
  13834.  bsr TLReqarea
  13835.  
  13836. .done:
  13837.  move.l (a7)+,xxp_FrontPen(a5)
  13838.  move.l (a7)+,xxp_IText(a5)
  13839.  movem.l (a7)+,d0-d7/a0-a6
  13840.  rts
  13841.  
  13842. *>>>> monitor the tabs. call w. D0-D1 as per TLkeyboard) D2=xpos, D3=ypos
  13843. ; call with   D0,D1 = TLkeyboard D1,D2
  13844. ;             D2,D3 = xpos,ypos of tabs (tabs must already be set up)
  13845. ; returns with D0=1+ for thumbtab clicked, else D0=0
  13846. TLTabmon:
  13847.  movem.l d0-d1/a5,-(a7)    ;save all exc result in d0
  13848.  clr.l (a7)                ;stack d0 = 0 pro-tem
  13849.  
  13850.  move.l xxp_AcWind(a4),a5  ;a5 = AcWind
  13851.  
  13852.  sub.w xxp_LeftEdge(a5),d0 ;make d0,d1 rel to window printable part
  13853.  bcs.s .done
  13854.  sub.w xxp_TopEdge(a5),d1
  13855.  bcs.s .done
  13856.  
  13857.  sub.w d2,d0               ;make d0,d1 rel to tabs area
  13858.  bcs.s .done
  13859.  sub.w d3,d1
  13860.  bcs.s .done
  13861.  
  13862.  cmp.w xxp_tblh+2(a4),d1   ;go if d1 not within thumbtabs
  13863.  bgt.s .done
  13864.  cmp.w xxp_tbbw+2(a4),d0   ;go if d0 not within thumbtabs
  13865.  bcc.s .done
  13866.  
  13867.  divu xxp_tblw+2(a4),d0    ;get whichever to d0 in stack
  13868.  and.l #$0000FFFF,d0
  13869.  addq.l #1,d0              ;make 1+
  13870.  move.l d0,(a7)
  13871.  
  13872.  move.l d0,d1              ;re-draw with clicked thumbtab in front
  13873.  moveq #0,d0
  13874.  bsr TLTabs
  13875.  
  13876. .done:
  13877.  movem.l (a7)+,d0-d1/a5
  13878.  rts
  13879.  
  13880. *>>>> draw 1 of the .pix pictures
  13881. ; D0 = num (0-11)
  13882. ; D1 = xpos
  13883. ; D2 = ypos
  13884. TLPict:
  13885.  movem.l d0-d7/a0-a6,-(a7) ;save all
  13886.  
  13887.  move.l xxp_gfxb(a4),a6    ;a6 = gfxb
  13888.  move.l xxp_AcWind(a4),a5  ;a5 = AcWind
  13889.  
  13890.  moveq #8,d4               ;picture size = 8X8
  13891.  moveq #8,d5
  13892.  
  13893.  move.w xxp_PWidth(a5),d3  ;check horz fit (quit without error if won't fit)
  13894.  sub.w d1,d3               ;d3 = max width that currently fits
  13895.  ble.s .done               ;quit if d3 <= 0
  13896.  cmp.w d4,d3               ;ok if d3 >= d4
  13897.  bcc.s .vert
  13898.  move.w d3,d4              ;else d3 to d4
  13899.  
  13900. .vert:
  13901.  move.w xxp_PHeight(a5),d3 ;check vert fit (quit without error if won't fit)
  13902.  sub.w d2,d3               ;d3 = max height that currently fits
  13903.  ble.s .done               ;quit if d3 <= 0
  13904.  cmp.w d5,d3               ;ok if d3 >= d5
  13905.  bcc.s .redi
  13906.  move.w d3,d5              ;else d3, to d5
  13907.  
  13908. .redi:
  13909.  move.l xxp_pixx(a4),a0    ;a0 = rport from
  13910.  move.l xxp_WPort(a5),a1   ;a1 = rport to
  13911.  move.l d2,d3
  13912.  move.l d1,d2              ;d2,d3 = to coords
  13913.  add.w xxp_LeftEdge(a5),d2
  13914.  add.w xxp_TopEdge(a5),d3  ;make d2,d3 rel to window edge
  13915.  mulu #8,d0                ;from xpos = 8*num
  13916.  moveq #0,d1               ;from ypos = 0
  13917.  move.w #$00C0,d6          ;JAM2
  13918.  bsr TLWCheck
  13919.  bne.s .bad                ;don't blit if window resized
  13920.  jsr _LVOClipBlit(a6)      ;do the blit
  13921.  clr.l xxp_errn(a4)        ;error = 0 if blitted
  13922.  bra.s .done
  13923.  
  13924. .bad:
  13925.  move.w #35,xxp_errn+2(a4) ;bad if window resized (error 35)
  13926.  
  13927. .done:
  13928.  movem.l (a7)+,d0-d7/a0-a6
  13929.  rts
  13930.  
  13931.  
  13932. *>>>> dropdown menu
  13933. TLDropdown:
  13934.  
  13935. ;pointers to the 64 byte workspace + pushed regs
  13936. .strs: equ 0               ;.L address of strings
  13937. .chrs: equ 4               ;.L max string len
  13938. .xpos: equ 8               ;.L menu xpos
  13939. .ypos: equ 12              ;.L menu ypos
  13940. .wdth: equ 16              ;.L menu width
  13941. .hght: equ 20              ;.L menu height (if dropped)
  13942. .what: equ 24              ;.L operative choice (1+)
  13943. .back: equ 28              ;.L output choice (0, or 1+ if user actvted menu)
  13944. .fsty: equ 32              ;.L calling window fsty,tspc cache
  13945. .fnum: equ 36              ;.W calling window fnum cahce
  13946. .slid: equ 38              ;
  13947. .pens: equ 40              ;.L calling window pens cache
  13948. .itxt: equ 44              ;.L calling window IText
  13949. .drop: equ 48              ;.L lines in drop
  13950. .slix: equ 52              ;.L }
  13951. .sliy: equ 56              ;.L } cache slider data
  13952. .sliw: equ 60              ;.L }
  13953. .slih: equ 64              ;.L }
  13954. .tops: equ 68              ;.L }
  13955. .totl: equ 72              ;.L }
  13956. .visi: equ 76              ;.L }
  13957. .hook: equ 80              ;.L }
  13958. .prev: equ 84              ;.L previous xxp_tops for .body
  13959.  
  13960. .d0: equ 84                ;input d0-d7
  13961. .d1: equ .d0+4
  13962. .d2: equ .d0+8
  13963. .d3: equ .d0+12
  13964. .d4: equ .d0+16
  13965. .d5: equ .d0+20
  13966. .d6: equ .d0+24
  13967. .d7: equ .d0+28
  13968.  
  13969.  movem.l d0-d7/a0-a6,-(a7) ;save all except result in D0 (level 64+)
  13970.  clr.l xxp_errn(a4)
  13971.  sub.w #.d0,a7             ;create a workspace
  13972.  
  13973.  move.l .d1(a7),d0         ;point .strs to 1st string
  13974.  bsr TLStra0
  13975.  move.l a0,.strs(a7)
  13976.  
  13977.  move.l xxp_AcWind(a4),a5  ;cache calling window data
  13978.  move.l xxp_Fsty(a5),.fsty(a7)
  13979.  move.w xxp_Fnum(a5),.fnum(a7)
  13980.  move.l xxp_FrontPen(a5),.pens(a7)
  13981.  move.l xxp_IText(a5),.itxt(a7)
  13982.  
  13983.  clr.w xxp_Tspc(a5)        ;set properties of window
  13984.  move.l a4,xxp_IText(a4)
  13985.  move.w #$0100,xxp_FrontPen(a5)
  13986.  move.b #RP_JAM1,xxp_DrawMode(a5)
  13987.  moveq #0,d0
  13988.  moveq #0,d1
  13989.  moveq #0,d2
  13990.  bsr TLNewfont
  13991.  
  13992.  move.l .d4(a7),.xpos(a7)  ;set .xpos,.ypos,.what
  13993.  move.l .d5(a7),.ypos(a7)
  13994.  move.l .d3(a7),.what(a7)
  13995.  clr.l .back(a7)           ;so far, no response from user
  13996.  
  13997.  move.l .d6(a7),d0         ;set .chrs...
  13998.  bne.s .f6ok               ;go if input d6<>0
  13999.  moveq #0,d0               ;else, find max string length
  14000.  move.l .d2(a7),d1
  14001.  subq.w #1,d1              ;d0 holds max, d1 counts strings
  14002.  move.l .strs(a7),a0       ;a0 scans strings
  14003. .fxd6:
  14004.  moveq #-1,d2              ;d2 counts chrs in string
  14005. .f6sc:
  14006.  addq.l #1,d2              ;set d2 to len of this string
  14007.  tst.b (a0)+
  14008.  bne .f6sc
  14009.  cmp.w d2,d0
  14010.  bcc.s .f6cy
  14011.  move.w d2,d0              ;put in d0 if d2>d0
  14012. .f6cy:
  14013.  dbra d1,.fxd6
  14014. .f6ok:
  14015.  move.l d0,.chrs(a7)       ;set .chrs with len of longest string / input d6
  14016.  
  14017.  lsl.w #3,d0               ;set .wdth
  14018.  add.w #16,d0
  14019.  move.l d0,.wdth(a7)
  14020.  
  14021.  tst.l .d0(a7)             ;go if only drawing
  14022.  beq .draw
  14023.  
  14024.  move.l xxp_kybd+4(a4),d1  ;d1,d2 = lmb xpos,ypos rel to window topleft
  14025.  move.l xxp_kybd+8(a4),d2
  14026.  sub.w xxp_LeftEdge(a5),d1
  14027.  sub.w .xpos+2(a7),d1
  14028.  sub.w .wdth+2(a7),d1
  14029.  add.w #12,d1
  14030.  bmi .no                   ;go if click was not within the V box
  14031.  cmp.w #12,d1
  14032.  bcc .no
  14033.  sub.w xxp_TopEdge(a5),d2
  14034.  sub.w .ypos+2(a7),d2
  14035.  bmi .no
  14036.  cmp.w #10,d2
  14037.  bcc .no
  14038.  
  14039. .yes:                      ;here if V box clicked
  14040.  tst.l .d7(a7)
  14041.  bpl.s .ydrp               ;go unless cycle only
  14042.  
  14043.  move.l .d3(a7),d0         ;cycle only: get input
  14044.  cmp.l .d2(a7),d0          ;was it = no of strings?
  14045.  bcs.s .only               ;no, ok
  14046.  moveq #0,d0               ;yes, back to 0
  14047. .only:
  14048.  addq.l #1,d0              ;bump it
  14049.  move.l d0,.back(a7)       ;put in back, what
  14050.  move.l d0,.what(a7)
  14051.  bra .draw                 ;& go draw
  14052.  
  14053. .ydrp:
  14054.  move.l .d2(a7),d3
  14055.  cmp.l .d7(a7),d3          ;set drop to least of input d2,d7
  14056.  ble.s .maxd
  14057.  move.l .d7(a7),d3
  14058. .maxd:
  14059.  move.l d3,.drop(a7)
  14060.  
  14061.  moveq #0,d0               ;move xpos,ypos if won't fit
  14062.  move.w xxp_PWidth(a5),d0
  14063.  sub.l .wdth(a7),d0        ;d0 = max posn for xpos that will fit
  14064.  bcc.s .xpcu
  14065.  moveq #0,d0
  14066. .xpcu:
  14067.  cmp.l .xpos(a7),d0
  14068.  bge.s .xpok
  14069.  move.l d0,.xpos(a7)       ;put xpos at d0 if xpos > d0
  14070. .xpok:
  14071.  move.w xxp_PHeight(a5),d0
  14072.  move.l .drop(a7),d1
  14073.  lsl.w #3,d1
  14074.  add.w #12,d1
  14075.  sub.l d1,d0               ;d0 = max posn for ypos that will fit
  14076.  bcc.s .ypcu
  14077.  moveq #0,d0
  14078. .ypcu:
  14079.  cmp.l .ypos(a7),d0
  14080.  bge.s .ypok
  14081.  move.l d0,.ypos(a7)       ;put ypos at d0 if ypos > d0
  14082. .ypok:
  14083.  
  14084.  move.l .xpos(a7),d0       ;backup area under drop to ERport
  14085.  move.l .ypos(a7),d1
  14086.  add.w #10,d1
  14087.  moveq #0,d2
  14088.  moveq #0,d3
  14089.  move.l .wdth(a7),d4       ;d4 = width
  14090.  moveq #0,d7
  14091.  move.w xxp_PWidth(a5),d7
  14092.  sub.w d0,d7               ;d7 = amt of window right of lhs
  14093.  ble.s .drdp               ;don't backup if none
  14094.  cmp.w d4,d7
  14095.  bcc.s .bku0
  14096.  move.w d7,d4              ;if that is < width, make that the width
  14097. .bku0:
  14098.  move.l .drop(a7),d5       ;d5 = height
  14099.  lsl.w #3,d5
  14100.  addq.w #2,d5
  14101.  move.w xxp_PHeight(a5),d7 ;d7 = amt of window bwlow top
  14102.  sub.w d1,d7
  14103.  ble.s .drdp               ;don't backup if none
  14104.  cmp.w d5,d7
  14105.  bcc.s .bku1
  14106.  move.w d7,d5              ;if that < height, make that the height
  14107. .bku1:
  14108.  add.w xxp_LeftEdge(a5),d0 ;make xpos,ypos rel to window edges
  14109.  add.w xxp_TopEdge(a5),d1
  14110.  move.w #$C0,d6            ;vanilla copy
  14111.  move.l xxp_gfxb(a4),a6
  14112.  move.l xxp_WPort(a5),a0   ;from window rastport
  14113.  move.l xxp_ERport(a4),a1  ;to ERport
  14114.  bsr TLWCheck
  14115.  bne .no                   ;quit if window resized
  14116.  jsr _LVOClipBlit(a6)      ;do the backup
  14117.  
  14118. .drdp:
  14119.  move.l .xpos(a7),d0       ;draw drop outline
  14120.  move.l .ypos(a7),d1
  14121.  add.w #10,d1
  14122.  move.l .wdth(a7),d2
  14123.  move.l .drop(a7),d3
  14124.  lsl.w #3,d3
  14125.  addq.w #2,d3
  14126.  moveq #3,d4
  14127.  bsr TLReqbev
  14128.  
  14129.  move.l xxp_slix(a4),.slix(a7) ;cache input slider data
  14130.  move.l xxp_sliy(a4),.sliy(a7)
  14131.  move.l xxp_sliw(a4),.sliw(a7)
  14132.  move.l xxp_slih(a4),.slih(a7)
  14133.  move.l xxp_tops(a4),.tops(a7)
  14134.  move.l xxp_totl(a4),.totl(a7)
  14135.  move.l xxp_strs(a4),.visi(a7)
  14136.  move.l xxp_hook(a4),.hook(a7)
  14137.  
  14138.  move.l .xpos(a7),d0       ;draw slider
  14139.  add.l .wdth(a7),d0
  14140.  sub.w #12,d0
  14141.  move.l d0,xxp_slix(a4)
  14142.  move.l .ypos(a7),d0
  14143.  add.w #10,d0
  14144.  move.l d0,xxp_sliy(a4)
  14145.  move.l #12,xxp_sliw(a4)
  14146.  move.l .drop(a7),d3
  14147.  lsl.w #3,d3
  14148.  addq.w #2,d3
  14149.  move.l d3,xxp_slih(a4)
  14150.  clr.l xxp_tops(a4)
  14151.  move.l .d2(a7),xxp_totl(a4)
  14152.  move.l .drop(a7),xxp_strs(a4)
  14153.  move.l #.body,xxp_hook(a4)
  14154.  move.l #-1,.prev(a7)
  14155.  move.l a7,a0              ;a0 = a7 data for .hook
  14156.  bsr TLSlider
  14157.  
  14158. .wait:                     ;menu dropped: wait for user response
  14159.  bsr TLWCheck
  14160.  bne .off                  ;quit if window resized
  14161.  bsr TLKeyboard
  14162.  cmp.b #$1B,d0             ;quit if Esc
  14163.  beq.s .off
  14164.  cmp.b #$93,d0             ;quit if window close
  14165.  beq.s .off
  14166.  cmp.b #$80,d0             ;else reject unless click
  14167.  bne .wait
  14168.  
  14169.  move.l d1,d4              ;see if within body width / V width
  14170.  sub.w xxp_LeftEdge(a5),d4
  14171.  sub.w .xpos+2(a7),d4
  14172.  subq.w #2,d4
  14173.  bmi.s .moni
  14174.  move.l .chrs(a7),d5
  14175.  lsl.w #3,d5
  14176.  addq.w #2,d5
  14177.  sub.w d5,d4
  14178.  bcs.s .trbd               ;go if within body width
  14179.  
  14180.  cmp.w #12,d4              ;within width of V button?
  14181.  bcc.s .moni               ;no, go
  14182.  moveq #0,d4
  14183.  move.w d2,d4
  14184.  sub.w xxp_TopEdge(a5),d4
  14185.  sub.w .ypos+2(a7),d4
  14186.  bmi.s .moni               ;go if above height of V button
  14187.  cmp.w #10,d4
  14188.  bcs.s .off                ;quit if within V button
  14189.  bcc.s .moni               ;else, try if in slider
  14190.  
  14191. .trbd:                     ;with body horz - see if vert
  14192.  moveq #0,d4
  14193.  move.w d2,d4
  14194.  sub.w xxp_TopEdge(a5),d4
  14195.  sub.w .ypos+2(a7),d4
  14196.  sub.w #11,d4
  14197.  bmi.s .moni               ;no, go
  14198.  lsr.w #3,d4               ;d4 = linum rel to body
  14199.  add.l xxp_tops(a4),d4     ;d4 = linum rel to input d2
  14200.  cmp.l .d2(a7),d4          ;go if off bottom of body
  14201.  bcc.s .moni
  14202.  
  14203.  addq.l #1,d4             ;item chosen - put in .back,.what
  14204.  move.l d4,.what(a7)
  14205.  move.l d4,.back(a7)
  14206.  bra.s .off               ;& switch off
  14207.  
  14208. .moni:                    ;monitor slider
  14209.  move.l a7,a0
  14210.  bsr TLSlimon
  14211.  bra .wait
  14212.  
  14213. .off:                      ;turn drop menu off
  14214.  move.l .xpos(a7),d2       ;restore area under drop from ERport
  14215.  move.l .ypos(a7),d3
  14216.  add.w #10,d3
  14217.  moveq #0,d0
  14218.  moveq #0,d1
  14219.  move.l .wdth(a7),d4       ;d4 = width
  14220.  moveq #0,d7
  14221.  move.w xxp_PWidth(a5),d7
  14222.  sub.w d2,d7               ;d7 = amt of window right of lhs
  14223.  ble.s .no                 ;don't restore if none
  14224.  cmp.w d4,d7
  14225.  bcc.s .rst0
  14226.  move.w d7,d4              ;if that is < width, make that the width
  14227. .rst0:
  14228.  move.l .drop(a7),d5       ;d5 = height
  14229.  lsl.w #3,d5
  14230.  addq.w #2,d5
  14231.  move.w xxp_PHeight(a5),d7 ;d7 = amt of window below top
  14232.  sub.w d3,d7
  14233.  ble.s .no                 ;don't restore if none
  14234.  cmp.w d5,d7
  14235.  bcc.s .rst1
  14236.  move.w d7,d5              ;if that < height, make that the height
  14237. .rst1:
  14238.  add.w xxp_LeftEdge(a5),d2 ;make xpos,ypos rel to window edges
  14239.  add.w xxp_TopEdge(a5),d3
  14240.  move.w #$C0,d6            ;vanilla copy
  14241.  move.l xxp_gfxb(a4),a6
  14242.  move.l xxp_WPort(a5),a1   ;to window rastport
  14243.  move.l xxp_ERport(a4),a0  ;from ERport
  14244.  bsr TLWCheck              ;don't blit if resized
  14245.  bne.s .no
  14246.  jsr _LVOClipBlit(a6)      ;do the restore
  14247.  
  14248. .no:
  14249.  move.l .d4(a7),.xpos(a7)  ;revert to input xpos,ypos to draw
  14250.  move.l .d5(a7),.ypos(a7)
  14251.  
  14252. .draw:                     ;draw the undropped menu
  14253.  move.l .xpos(a7),d0       ;text background
  14254.  move.l .ypos(a7),d1
  14255.  move.l .wdth(a7),d2
  14256.  move.l #10,d3
  14257.  sub.l #12,d2
  14258.  moveq #0,d4
  14259.  bset #29,d0
  14260.  bsr TLReqarea
  14261.  
  14262.  bclr #29,d0               ;text bev
  14263.  bsr TLReqbev
  14264.  
  14265.  addq.w #2,d0              ;text of .what
  14266.  addq.w #1,d1
  14267.  move.l .strs(a7),a0       ;find text
  14268.  move.l .what(a7),d4
  14269.  subq.w #1,d4
  14270.  bra.s .dwfw
  14271. .dwnx:
  14272.  tst.b (a0)+
  14273.  bne .dwnx
  14274. .dwfw:
  14275.  dbra d4,.dwnx
  14276.  move.l a4,a1
  14277. .dwtf:
  14278.  move.b (a0)+,(a1)+        ;tfr text to buff
  14279.  bne .dwtf
  14280.  move.l .chrs(a7),d4       ;len <= .chrs
  14281.  clr.b 0(a4,d4.w)
  14282.  bsr TLTrim                ;print it
  14283.  subq.w #2,d0
  14284.  subq.w #1,d1
  14285.  
  14286.  add.l d2,d0               ;bev around V
  14287.  moveq #12,d2
  14288.  bsr TLReqbev
  14289.  
  14290.  move.l d1,d2              ;draw V
  14291.  move.l d0,d1
  14292.  addq.w #2,d1
  14293.  addq.w #1,d2
  14294.  moveq #9,d0
  14295.  tst.l .d7(a7)
  14296.  bpl.s .pict
  14297.  moveq #12,d0              ;(if cycle, draw pict 12)
  14298. .pict:
  14299.  bsr TLPict
  14300.  
  14301. .done:
  14302.  tst.w .slid(a7)           ;restore slider data if cached
  14303.  beq.s .nsld
  14304.  move.l .slix(a7),xxp_slix(a4)
  14305.  move.l .sliy(a7),xxp_sliy(a4)
  14306.  move.l .sliw(a7),xxp_sliw(a4)
  14307.  move.l .slih(a7),xxp_slih(a4)
  14308.  move.l .tops(a7),xxp_tops(a4)
  14309.  move.l .totl(a7),xxp_totl(a4)
  14310.  move.l .visi(a7),xxp_strs(a4)
  14311.  move.l .hook(a7),xxp_hook(a4)
  14312. .nsld:
  14313.  
  14314.  move.l xxp_AcWind(a4),a5  ;restore calling window properties
  14315.  move.w .fsty+2(a7),xxp_Tspc(a5)
  14316.  move.l .pens(a7),xxp_FrontPen(a5)
  14317.  move.l .itxt(a7),xxp_IText(a5)
  14318.  moveq #0,d0
  14319.  move.w .fnum(a7),d0
  14320.  moveq #0,d1
  14321.  move.w .fsty(a7),d1
  14322.  moveq #0,d2
  14323.  bsr TLNewfont
  14324.  
  14325.  move.l .back(a7),.d0(a7)  ;put result in stack D0 (0 unless selection made)
  14326.  
  14327.  add.w #.d0,a7             ;discard workspace & return
  14328.  movem.l (a7)+,d0-d7/a0-a6
  14329.  rts
  14330.  
  14331. ; TLDropmenu subroutine
  14332.  
  14333. .body:                     ;** draw body of drop
  14334.  move.l xxp_Stak(a4),a0
  14335.  move.l 32(a0),a6          ;retrieve caller A0 = pointer to A7 data
  14336.  
  14337.  move.l xxp_tops(a4),d0    ;quit if tops = prev
  14338.  cmp.l .prev(a6),d0
  14339.  beq .bqut
  14340.  move.l d0,.prev(a6)       ;else, set prev to new tops
  14341.  
  14342.  move.l .xpos(a6),d0       ;draw drop background
  14343.  addq.w #2,d0
  14344.  move.l .ypos(a6),d1
  14345.  add.w #11,d1
  14346.  move.l .wdth(a6),d2
  14347.  sub.w #14,d2
  14348.  move.l .drop(a6),d3
  14349.  lsl.w #3,d3
  14350.  moveq #3,d4
  14351.  bset #29,d0
  14352.  bsr TLReqarea
  14353.  
  14354.  move.l .what(a6),d3      ;highlight background of .what
  14355.  subq.l #1,d3
  14356.  sub.l xxp_tops(a4),d3
  14357.  bmi.s .nbck              ;go if .what not visible right now (above top)
  14358.  cmp.l .drop(a6),d3
  14359.  bcc.s .nbck              ;go if .what not visible right now (below bot)
  14360.  lsl.w #3,d3
  14361.  add.l d3,d1
  14362.  moveq #8,d3
  14363.  moveq #0,d4
  14364.  bsr TLReqarea
  14365. .nbck:
  14366.  bclr #29,d0
  14367.  
  14368.  move.l .strs(a6),a0      ;a0 = address of 1st string
  14369.  move.l xxp_tops(a4),d2   ;d2 = 1st visible
  14370.  bra.s .hkfw
  14371. .hknx:
  14372.  tst.b (a0)+              ;bypass all before 1st visible
  14373.  bne .hknx
  14374. .hkfw:
  14375.  dbra d2,.hknx
  14376.  
  14377.  move.l .drop(a6),d2      ;d2 counts strings printed
  14378.  subq.w #1,d2
  14379.  move.l .xpos(a6),d0      ;d0 = xpos
  14380.  addq.w #2,d0
  14381.  move.l .ypos(a6),d1      ;d1 = ypos
  14382.  add.w #11,d1
  14383.  
  14384. .prnt:                    ;print next string
  14385.  move.l a4,a1
  14386. .prtf:
  14387.  move.b (a0)+,(a1)+       ;tfr to buff
  14388.  bne .prtf
  14389.  move.l .chrs(a6),d3      ;truncate if required
  14390.  clr.b 0(a4,d3.w)
  14391.  bsr TLTrim               ;print it
  14392.  addq.w #8,d1             ;bump ypos
  14393.  dbra d2,.prnt            ;until all printed
  14394.  
  14395. .bqut:
  14396.  rts
  14397.  
  14398.  
  14399. *>>>> maintain a set of ASCII lines
  14400. TLMultiline:
  14401.  
  14402. ; Call:    D0 has bit 1 set if mem unsaved; bit 31 set if view only
  14403. ;                                               and TLMultiline forbids
  14404. ;          D1 has TLReqedit forbids
  14405.  
  14406. ; Retn:    xxp_errn = 0 if ok (possible errors 1,2,30,31,32,34)
  14407. ;          xxp_Mmem,Mtop,Mcrr,Mmxc,Mtpl set
  14408. ;          xxp_chnd  bit0=1 if changed,  bit1=1 if unsaved
  14409. ;          xxp_lins  set
  14410. ;          xxp_kybd  set  $1B=Esc  $93=Close  $97=Inactive
  14411.  
  14412. ; save regs &c
  14413.  
  14414.  movem.l d0-d7/a0-a6,-(a7) ;save all except result in d0
  14415.  
  14416.  move.l d0,d6              ;remember input d0,d1
  14417.  move.l d1,d5
  14418.  
  14419.  move.l xxp_AcWind(a4),a5  ;* A5 = active window throughout TLMultiline
  14420.  
  14421.  move.l xxp_strg(a4),-(a7) ;save global strings
  14422.  move.l (a7),d7
  14423.  move.l xxp_Help(a4),-(a7) ;save global help
  14424.  move.l xxp_FrontPen(a5),-(a7) ;save pens, DrMode, IText
  14425.  move.l xxp_IText(a5),-(a7)
  14426.  move.l #.str,xxp_strg(a4) ;attach local strings
  14427.  clr.l xxp_errn(a4)        ;errn=0 pro-tem
  14428.  move.l xxp_Menu(a5),-(a7) ;save window's existing menu (if any)
  14429.  move.l xxp_Menu+2(a5),-(a7) ;save window's menuon (in lsw)
  14430.  bsr TLReqmuclr            ;and switch it off (if exists,on)
  14431.  clr.l xxp_Menu(a5)        ;so far, no TLMultiline menu
  14432.  move.l xxp_Fnum(a5),-(a7) ;save Fnum (in lsw)
  14433.  move.l xxp_Fsty(a5),-(a7) ;save Fsty,Tspc
  14434.  move.l xxp_RFont(a5),-(a7) ;save RFont,HFont
  14435.  move.l xxp_RTspc(a5),-(a7) ;save RTspc,HTspc
  14436.  move.l xxp_RFsty(a5),-(a7) ;save RFsty,HFsty
  14437.  
  14438.  moveq #0,d0
  14439.  move.w xxp_Fnum(a5),d0
  14440.  moveq #0,d1
  14441.  moveq #0,d2
  14442.  bsr TLNewfont             ;window font =  input font plain
  14443.  
  14444.  move.l xxp_pref(a4),a0
  14445.  moveq #10,d0
  14446.  moveq #0,d1
  14447.  move.b xxp_ysty(a0),d1
  14448.  moveq #1,d2
  14449.  bsr TLNewfont             ;requester font = as per prefs
  14450.  
  14451.  moveq #0,d0
  14452.  moveq #0,d1
  14453.  moveq #2,d2
  14454.  bsr TLNewfont             ;help font = 0 plain
  14455.  
  14456.  clr.w xxp_Tspc(a5)        ;Tspc=0
  14457.  clr.l xxp_RTspc(a5)       ;RTspc,HTspc = as per prefs
  14458.  move.b xxp_yspc(a0),xxp_RTspc+1(a5)
  14459.  
  14460.  move.w #$0100,xxp_FrontPen(a5)   ;pens = 1,0
  14461.  move.b #RP_JAM2,xxp_DrawMode(a5) ;drawmode = jam2
  14462.  
  14463.  sub.w #128,a7             ;* create a workspace
  14464.  move.l a7,a6              ;* a6 = workspace pointer throughout Multiline
  14465.  
  14466. ; Multiline - temporary variables, offset from (A6) in stack
  14467.  
  14468. .mmem: equ 0               ;.L memory base
  14469. .mtop: equ 4               ;.L current memory top
  14470. .fdir: equ 8               ;.L limit of memory, also 130 bytes for dir
  14471. .ffil: equ 12              ;.L limit of .fdir, also 34 bytes for fil
  14472. .lins: equ 16              ;.L current number of lines
  14473. .curr: equ 20              ;.L current line
  14474. .crsr: equ 24              ;.W cursor tab
  14475. .mmxc: equ 26              ;.W max chrs per line
  14476. .topl: equ 28              ;.L topline on display
  14477. .fonh: equ 32              ;.W font height
  14478. .tpla: equ 34              ;.L topline address
  14479. .crra: equ 38              ;.L current line address
  14480. .slns: equ 42              ;.W lines that currently fit on window
  14481. .offs: equ 44              ;.W operative offset
  14482. .d2d5: equ 46              ;.L*4 current d2-d5 for ScrollRaster of window
  14483. .rngs: equ 62              ;.L starting line of range
  14484. .rnge: equ 66              ;.L ending line of range
  14485. .kybd: equ 70              ;.W <> if crsr posn in pixels
  14486. .glob: equ 72              ;.L global string address
  14487. .work: equ 76              ;.L used by .rwrp to hold old .lins value
  14488. .chnd: equ 80              ;.L return bits (see below)
  14489. .forb: equ 84              ;.L TLReqedit forbids
  14490. .lock: equ 88              ;.W 0=unlock, -1=lock
  14491. .rlok: equ 90              ;.W 0 = can lock/unlock  -1 = cannot unlock
  14492. .slir: equ 92              ;.W -1 = scrollers present
  14493. .valc: equ 94              ;.W -1 = don't request width in .vald unless must
  14494. .ypos: equ 98              ;.W ypos used by .draw
  14495. .pqal: equ 100             ;.L frst line to be printed
  14496. .pqzl: equ 104             ;.L last line of page to be printed
  14497. .pqzz: equ 108             ;.L last line to be printed
  14498. .pqla: equ 112             ;.L address of first line to be printed
  14499. .pqpg: equ 116             ;.B lines per page
  14500. .pqcl: equ 117             ;.B chrs per line
  14501. .pqmg: equ 118             ;.B chrs in margin
  14502. .pqts: equ 119             ;.B 0/1/2/3 = none/print/skip/abandon print
  14503. .pqkk: equ 120             ;.L line num clicked in .pqdo/.hook subroutine
  14504.  
  14505. ; .chnd bits  0: 1 if mem changed since call
  14506. ;             1: 1 if mem changed since save
  14507. ;
  14508. ; The initial state of .chnd is set by D0 on call
  14509.  
  14510. ; Multiline - check memory exists, else create, other setting up
  14511.  
  14512.  clr.w .slir(a6)           ;set .slir if scrollers
  14513.  tst.l xxp_scrl(a5)
  14514.  beq.s .nsld
  14515.  subq.w #1,.slir(a6)
  14516.  move.l xxp_scrl(a5),a0    ;init horz scroller
  14517.  move.l #2048,xxp_hztt(a0)
  14518.  clr.l xxp_hztp(a0)
  14519.  move.l #2048,xxp_hzvs(a0)
  14520.  moveq #0,d0
  14521.  moveq #1,d1
  14522.  bsr TLWscroll
  14523.  
  14524. .nsld:
  14525.  
  14526.  clr.w .lock(a6)           ;set .lock = -1 if bit 31 of d6 (=input d0) set
  14527.  clr.w .rlok(a6)           ;by default, unlocked, can lock / unlock
  14528.  tst.l d6
  14529.  bpl.s .nlok               ;if D0 bit 31 set on call:
  14530.  subq.w #1,.lock(a6)       ;  lock text
  14531.  subq.w #1,.rlok(a6)       ;  forbid unlocking
  14532.  clr.w .offs(a6)           ;  offs = 0
  14533.  bclr #31,d6
  14534. .nlok:
  14535.  
  14536.  bclr #0,d6                ;mem not yet changed since call
  14537.  and.l #$0FFF,d5           ;forb bits - only bits 0-11 applicable
  14538.  btst #2,d6
  14539.  beq.s .nfpg               ;go unless paging forbidden
  14540.  bset #4,d6                ;forbid blocking
  14541.  bset #5,d6                ;forbid page/block shape
  14542. .nfpg:
  14543.  move.l d5,.forb(a6)
  14544.  move.l d6,.chnd(a6)       ;bits set by caller (0=changed, 1=unsaved)
  14545.  
  14546.  clr.w .kybd(a6)           ;annul .kybd
  14547.  move.l xxp_FSuite(a4),a0
  14548.  move.w xxp_Fnum(a5),d0
  14549.  mulu #xxp_fsiz,d0
  14550.  move.w ta_YSize(a0,d0.w),.fonh(a6) ;set font height
  14551.  move.l d7,.glob(a6)       ;save global string address
  14552.  clr.w .crsr(a6)           ;init .crsr
  14553.  
  14554.  move.l xxp_Mmem(a5),d0    ;memory already created?
  14555.  bne.s .memc               ;yes, go
  14556.  move.l xxp_sysb(a4),a6
  14557.  move.l xxp_Mmsz(a5),d0
  14558.  moveq #MEMF_FAST,d1
  14559.  jsr _LVOAllocVec(a6)      ;* create memory
  14560.  move.l a7,a6              ;re-point a6 to internal variables
  14561.  beq .bad1                 ;bad if out of memory
  14562.  move.l d0,a0
  14563.  add.l xxp_Mmsz(a5),a0
  14564.  clr.b -34(a0)             ;init .ffil (filename for saving)
  14565.  clr.b -164(a0)            ;init .fdir (dirname for saving)
  14566.  
  14567.  move.l d0,a0
  14568.  move.l a0,xxp_Mmem(a5)    ;initialise wsuw data
  14569.  clr.b (a0)+
  14570.  move.l a0,xxp_Mtop(a5)
  14571.  clr.l xxp_Mcrr(a5)
  14572.  move.w #76,xxp_Mmxc(a5)
  14573.  clr.l xxp_Mtpl(a5)
  14574. .memc:
  14575.  
  14576.  move.l xxp_Mmem(a5),.mmem(a6) ;init .mmem
  14577.  move.l xxp_Mcrr(a5),.curr(a6) ;init .curr
  14578.  move.w xxp_Mmxc(a5),.mmxc(a6) ;init .mmxc
  14579.  move.l xxp_Mtop(a5),.mtop(a6) ;init .mtop
  14580.  move.l xxp_Mtpl(a5),.topl(a6) ;init .topl
  14581.  
  14582.  add.l xxp_Mmsz(a5),d0     ;* initialise other pointers, validate memory
  14583.  sub.l #34,d0
  14584.  move.l d0,.ffil(a6)       ;init .ffil
  14585.  sub.l #130,d0
  14586.  move.l d0,.fdir(a6)       ;init .fdir
  14587.  move.w #-1,.valc(a6)
  14588.  bsr .vald                 ;initialise lins, mtop, validate text
  14589.  move.b xxp_lppg(a4),.pqpg(a6) ;get intuition printer prefs
  14590.  move.b xxp_cpln(a4),.pqcl(a6)
  14591.  move.b xxp_marg(a4),.pqmg(a6)
  14592.  
  14593.  lea .ment,a0              ;* initialise menu
  14594.  bsr TLReqmenu
  14595.  tst.l d0                  ;bad if can't
  14596.  beq .bad2
  14597.  bsr TLReqmuset
  14598.  bsr .able                 ;switch menu items on/off
  14599.  
  14600. ; Multiline - recycle here if window to be redrawn with new .curr
  14601.  
  14602. .kapt:
  14603.  move.l .mmem(a6),a0       ;seek .curr - a0 scans .mmem
  14604.  move.l .curr(a6),d0       ;d0 counts lines
  14605.  bra.s .nxcr
  14606. .crfw:
  14607.  tst.b (a0)+               ;to next line
  14608.  bne .crfw
  14609. .nxcr:
  14610.  subq.l #1,d0              ;until .curr reached
  14611.  bpl .crfw
  14612.  move.l a0,.crra(a6)       ;set .crra
  14613.  
  14614. ; Multiline - recycle here if window to be redrawn with same .curr
  14615.  
  14616. .nsls:
  14617.  bsr .slsr                 ;check .topl, get .tpla, clear window, &c
  14618.  beq .bad3                 ;bad if window height > font height
  14619.  bsr .chek                 ;preview curr, set .offs
  14620.  beq .done                 ;go if bad (when errn already set)
  14621.  bsr .draw                 ;draw all lines on window
  14622.  beq .done                 ;go if bad (when errn already set)
  14623.  bpl .nsls                 ;go try again if window resized
  14624.  
  14625. ; Multiline - recycle here to wait for keyboard input
  14626.  
  14627. .wait:
  14628.  bsr TLWCheck              ;redraw window if resized
  14629.  bne .nsls
  14630.  bsr .vert                 ;fix scrollers
  14631.  tst.w .lock(a6)
  14632.  bne .lokt                 ;go if locked
  14633.  bsr .edit                 ;edit .curr
  14634.  cmp.w #10,d0              ;redo if bad fixed offset
  14635.  beq .nsls
  14636.  bsr .conu                 ;process contin (if any)
  14637.  tst.l xxp_errn(a4)
  14638.  bne .done                 ;quit if .edit gave bad return
  14639.  
  14640.  move.b xxp_kybd+15(a4),d3 ;d3 = shift of last keyboard entry to TLReqedit
  14641.  move.b xxp_kybd+3(a4),d0  ;d0 = last keyboard entry to TLReqedit
  14642.  beq .wait
  14643.  cmp.b #$8E,d0             ;up arrow
  14644.  beq.s .upar
  14645.  cmp.b #$8F,d0             ;down arrow
  14646.  beq .dnar
  14647.  cmp.b #$80,d0             ;click
  14648.  beq .clik
  14649.  cmp.b #$95,d0             ;menu
  14650.  beq .mens
  14651.  cmp.b #$98,d0             ;scroller
  14652.  beq .scol
  14653.  btst #3,d3                ;Ctrl
  14654.  bne .ctrl
  14655.  bra .othr                 ;other inputs
  14656.  
  14657. ; Multiline - up arrow
  14658.  
  14659. .upar:
  14660.  btst #0,d3                ;if shift, up a window full
  14661.  bne .upwd
  14662.  
  14663. .up1:
  14664.  move.l .curr(a6),d0       ;don't scroll if curr already = 0
  14665.  beq .wait
  14666.  cmp.l .topl(a6),d0        ;go if topl < curr
  14667.  bne .upcn
  14668.  moveq #0,d1               ;d1 = amt to scroll
  14669.  move.w .fonh(a6),d1
  14670.  
  14671.  moveq #0,d0               ;do the scroll
  14672.  neg.l d1
  14673.  move.l .d2d5(a6),d2
  14674.  move.l .d2d5+4(a6),d3
  14675.  move.l .d2d5+8(a6),d4
  14676.  move.l .d2d5+12(a6),d5
  14677.  move.l xxp_WPort(a5),a1
  14678.  move.l a6,a2
  14679.  bsr TLWCheck
  14680.  bne.s .updc
  14681.  move.l xxp_gfxb(a4),a6
  14682.  jsr _LVOScrollRaster(a6)  ;(don't scroll if window resized)
  14683.  move.l a2,a6
  14684. .updc:
  14685.  
  14686.  subq.l #1,.curr(a6)       ;dec curr, topline
  14687.  subq.l #1,.topl(a6)
  14688.  beq.s .upb0               ;(go if topline became zero)
  14689.  move.l .tpla(a6),a0       ;find line before topline
  14690.  subq.l #1,a0
  14691. .upbk:
  14692.  tst.b -(a0)
  14693.  bne .upbk
  14694.  addq.l #1,a0
  14695.  move.l a0,.tpla(a6)       ;put line before topline in tpla,crra
  14696.  move.l a0,.crra(a6)
  14697.  bra.s .upbc
  14698.  
  14699. .upb0:
  14700.  move.l .mmem(a6),.tpla(a6) ;if topline became zero, put mmem in tpla
  14701.  move.l .mmem(a6),.crra(a6) ;if curr became zero, put mmem in tpla
  14702.  
  14703. .upbc:                     ;go edit if unlocked (.edit will print curr)
  14704.  tst.w .lock(a6)
  14705.  beq .wait
  14706.  
  14707.  sub.w #28,a7              ;echo topline if locked
  14708.  move.l a7,a0
  14709.  move.l #xxp_xoffs,(a0)+   ;tag 1: fixed offset
  14710.  clr.w (a0)+
  14711.  move.w .offs(a6),(a0)+
  14712.  move.l #xxp_xtext,(a0)+   ;tag 2: point to text
  14713.  move.l .crra(a6),(a0)+
  14714.  move.l #xxp_xcrsr,(a0)+   ;tag 3: no cursor
  14715.  move.l #-1,(a0)+
  14716.  clr.l (a0)                ;delimit tags
  14717.  moveq #0,d0               ;xpos = 0
  14718.  moveq #0,d1               ;ypos = 0
  14719.  move.l a7,a0
  14720.  bsr TLWCheck              ;don't echo if window resized
  14721.  bne.s .spbq
  14722.  jsr TLReqedit             ;echo topline
  14723. .spbq:
  14724.  add.w #28,a7
  14725.  bra .wait
  14726.  
  14727. .upcn:                     ;here if curr was below topline
  14728.  subq.l #1,.curr(a6)       ;dec curr
  14729.  bne.s .upnz               ;go unless became zero
  14730.  move.l .mmem(a6),.crra(a6)
  14731.  bra .wait
  14732.  
  14733. .upnz:                     ;find line before curr, put in crra
  14734.  move.l .crra(a6),a0
  14735.  subq.l #1,a0
  14736. .upck:
  14737.  tst.b -(a0)
  14738.  bne .upck
  14739.  addq.l #1,a0
  14740.  move.l a0,.crra(a6)
  14741.  bra .wait                 ;& to edit
  14742.  
  14743. .upwd:                     ;* up a window-full
  14744.  moveq #0,d0               ;set topl, curr
  14745.  move.w .slns(a6),d0
  14746.  subq.w #1,d0              ;d0 =  1 less than lines in window
  14747.  beq .up1                  ;(go if only 1 line on window)
  14748.  move.l .topl(a6),d1
  14749.  sub.l d0,d1               ;get new topl
  14750.  bcc.s .upw1               ;go if to line 0
  14751.  moveq #0,d1
  14752. .upw1:
  14753.  move.l d1,.topl(a6)       ;fix topl (slsr will fix tpla)
  14754. .upw2:
  14755.  move.l .curr(a6),d1       ;fix curr
  14756.  sub.l d0,d1
  14757.  bhi.s .upw3               ;go if curr becomes > 0
  14758.  
  14759.  clr.l .curr(a6)
  14760.  move.l .mmem(a6),.crra(a6) ;if new curr = 0, fix crra & go
  14761.  bra .nsls
  14762.  
  14763. .upw3:
  14764.  move.l d1,.curr(a6)
  14765.  move.l .crra(a6),a0
  14766.  subq.l #1,a0
  14767.  subq.l #1,d0
  14768. .upw4:
  14769.  tst.b -(a0)               ;find new crra
  14770.  bne .upw4
  14771.  dbra d0,.upw4
  14772.  addq.l #1,a0
  14773.  move.l a0,.crra(a6)
  14774.  bra .nsls
  14775.  
  14776. ; Multiline - down arrow
  14777.  
  14778. .dnar:                     ;* down arrow
  14779.  btst #0,d3                ;shift?
  14780.  bne .dwwd                 ;yes, down a window full
  14781.  
  14782. .dw1:
  14783.  move.l .curr(a6),d0
  14784.  addq.l #1,d0
  14785.  cmp.l .lins(a6),d0        ;go if curr already at last line
  14786.  beq .wait
  14787.  
  14788.  move.l d0,.curr(a6)       ;bump curr
  14789.  move.l .crra(a6),a0
  14790. .dwca:
  14791.  tst.b (a0)+               ;curra to next line
  14792.  bne .dwca
  14793.  move.l a0,.crra(a6)
  14794.  
  14795.  tst.w .lock(a6)           ;go if text locked (always scroll up)
  14796.  bne.s .dwlk
  14797.  
  14798.  sub.l .topl(a6),d0        ;curr still on window?
  14799.  cmp.w .slns(a6),d0
  14800.  bcs .wait                 ;yes, done
  14801.  
  14802.  bsr .cotr                 ;else scroll up & continue
  14803.  bra .wait
  14804.  
  14805. .dwlk:                     ;* window is locked - scroll up 1
  14806.  move.l d0,.topl(a6)       ;topl at curr
  14807.  move.l a0,.tpla(a6)
  14808.  
  14809.  move.l .d2d5(a6),d2       ;scroll up past old topl
  14810.  move.l .d2d5+4(a6),d3
  14811.  move.l .d2d5+8(a6),d4
  14812.  move.l .d2d5+12(a6),d5
  14813.  moveq #0,d0
  14814.  moveq #0,d1
  14815.  move.w .fonh(a6),d1
  14816.  move.l xxp_WPort(a5),a1
  14817.  move.l a6,a2
  14818.  move.l xxp_gfxb(a4),a6
  14819.  jsr TLWCheck              ;don't scroll if window resized
  14820.  bne.s .dwlr
  14821.  jsr _LVOScrollRaster(a6)
  14822. .dwlr:
  14823.  move.l a2,a6
  14824.  
  14825.  move.l .curr(a6),d0       ;go if botline past eof
  14826.  moveq #0,d1
  14827.  move.w .slns(a6),d1
  14828.  add.l d1,d0
  14829.  cmp.l .lins(a6),d0
  14830.  bhi .wait
  14831.  
  14832.  move.l .crra(a6),a1       ;point a1 to last line
  14833.  subq.w #1,d1
  14834.  move.w d1,d2
  14835.  mulu .fonh(a6),d1         ;d1 = ypos of botline
  14836.  bra.s .dwln
  14837. .dwlf:
  14838.  tst.b (a1)+
  14839.  bne .dwlf
  14840. .dwln:
  14841.  dbra d2,.dwlf
  14842.  
  14843.  sub.w #28,a7              ;print last line
  14844.  move.l a7,a0
  14845.  move.l #xxp_xoffs,(a0)+   ;tag 1: fixed offset
  14846.  clr.w (a0)+
  14847.  move.w .offs(a6),(a0)+
  14848.  move.l #xxp_xtext,(a0)+   ;tag 2: point to text
  14849.  move.l a1,(a0)+
  14850.  move.l #xxp_xcrsr,(a0)+   ;tag 3: no cursor
  14851.  move.l #-1,(a0)+
  14852.  clr.l (a0)                ;delimit tags
  14853.  moveq #0,d0               ;xpos = 0
  14854.  move.l a7,a0
  14855.  jsr TLReqedit
  14856.  add.w #28,a7
  14857.  bra .wait
  14858.  
  14859. .dwwd:                     ;* down a window full
  14860.  moveq #0,d0
  14861.  move.w .slns(a6),d0       ;down lines on window - 1
  14862.  subq.w #2,d0              ;d0 counts lines
  14863.  bmi .dw1                  ;go if only 1 line in window
  14864.  
  14865.  move.l .curr(a6),d1       ;d1 bumps curr
  14866.  move.l .crra(a6),a0       ;a0 bumps crra
  14867. .dww1:
  14868.  addq.l #1,d1              ;bump curr
  14869.  cmp.l .lins(a6),d1
  14870.  bcc .nsls                 ;go if end reached
  14871.  addq.l #1,.topl(a6)       ;bump topl
  14872.  addq.l #1,.curr(a6)       ;bump curr
  14873. .dww2:
  14874.  tst.b (a0)+               ;bump crra
  14875.  bne .dww2
  14876.  move.l a0,.crra(a6)
  14877.  dbra d0,.dww1             ;until window-full bypassed
  14878.  bra .nsls
  14879.  
  14880. ; Multiline - Ctrl keys
  14881.  
  14882. .ctrl:                     ;* Ctrl pressed
  14883.  btst #0,d3
  14884.  bne .shct                 ;go if shift
  14885.  cmp.b #1,d0
  14886.  beq .frst                 ;Ctrl a  -> first line
  14887.  cmp.b #4,d0
  14888.  beq .dlin                 ;Ctrl d  -> delete line
  14889.  cmp.b #26,d0
  14890.  beq .last                 ;Ctrl z  -> last line
  14891. .shct:
  14892.  cmp.b #1,d0
  14893.  beq .srng                 ;Shift/Ctrl/A  -> mark start of range
  14894.  cmp.b #4,d0
  14895.  beq .drng                 ;Shift/Ctrl/D  -> delete range
  14896.  cmp.b #9,d0
  14897.  beq .irng                 ;Shift/Ctrl/I  -> insert range
  14898.  cmp.b #26,d0
  14899.  beq .erng                 ;Shift/Ctrl/Z  -> mark end of range
  14900.  
  14901. .frst:                     ;* Ctrl a  -> first line
  14902.  clr.l .curr(a6)
  14903.  clr.l .topl(a6)           ;.curr, .topl = 0
  14904.  bra .kapt
  14905.  
  14906. .last:                     ;* Ctrl z  -> last line
  14907.  move.l .lins(a6),d0
  14908.  subq.l #1,d0
  14909.  move.l d0,.curr(a6)       ;curr = last line
  14910.  moveq #0,d1
  14911.  move.w .slns(a6),d1
  14912.  subq.l #1,d1
  14913.  beq .kapt                 ;(go if only 1 line in window - will fix topl)
  14914.  sub.l d1,d0
  14915.  move.l d0,.topl(a6)       ;topl = window-full above curr
  14916.  bpl .kapt
  14917.  clr.l .topl(a6)           ;or 0 if can't
  14918.  bra .kapt
  14919.  
  14920. .dlin:                     ;* Ctrl d  -> delete line
  14921.  ori.b #3,.chnd+3(a6)
  14922.  move.l .lins(a6),d0
  14923.  subq.l #1,d0
  14924.  beq .dlls                 ;-> new if only 1 line remains
  14925.  
  14926.  move.l #-1,.rngs(a6)
  14927.  move.l #-1,.rnge(a6)      ;annul range
  14928.  
  14929.  cmp.l .curr(a6),d0
  14930.  bne .dlok                 ;go unless curr is last line
  14931.  move.l d0,.lins(a6)       ;curr = last line: dec lins
  14932.  move.l .crra(a6),.mtop(a6) ;note new mtop
  14933.  subq.l #1,.curr(a6)       ;dec curr
  14934.  clr.w .crsr(a6)           ;clear crsr
  14935.  bra .kapt                 ;& redraw window
  14936. .dlok:
  14937.  
  14938.  move.l .curr(a6),d6
  14939.  sub.l .topl(a6),d6        ;d6 = curr's linum rel to topl
  14940.  move.l .d2d5(a6),d2       ;up scroll lines from curr
  14941.  move.l .d2d5+8(a6),d4     ;d2,d4,d5 as per scroll all
  14942.  move.l .d2d5+12(a6),d5
  14943.  move.l d6,d3
  14944.  mulu .fonh(a6),d3         ;d3 = border top + dist to curr
  14945.  add.l .d2d5+4(a6),d3
  14946.  moveq #0,d0               ;d0 = 0
  14947.  moveq #0,d1
  14948.  move.w .fonh(a6),d1       ;d1 = font height
  14949.  move.l xxp_WPort(a5),a1
  14950.  move.l a6,a2
  14951.  move.l xxp_gfxb(a4),a6
  14952.  bsr TLWCheck
  14953.  bne.s .dlic               ;go if window resized
  14954.  jsr _LVOScrollRaster(a6)  ;do the scroll
  14955. .dlic:
  14956.  move.l a2,a6
  14957.  move.l .mtop(a6),a2       ;a2 = old memtop
  14958.  move.l .crra(a6),a0       ;a0 puts
  14959.  move.l a0,a1              ;a1 gets
  14960. .dl1f:
  14961.  tst.b (a1)+               ;point a1 to line after crra
  14962.  bne .dl1f
  14963.  bra.s .dlfw               ;to next get
  14964. .dlnx:
  14965.  move.b (a1)+,(a0)+        ;tfr a line down
  14966.  bne .dlnx
  14967. .dlfw:
  14968.  cmp.l a2,a1               ;have we reached old mtop?
  14969.  bcs .dlnx                 ;no, tfr next line
  14970.  move.l a0,.mtop(a6)       ;yes, note new memtop
  14971.  subq.l #1,.lins(a6)       ;dec lins
  14972.  clr.w .crsr(a6)           ;clr crsr
  14973.  move.l .crra(a6),a1       ;a1 finds bottom line of window
  14974.  move.w .slns(a6),d5
  14975.  sub.w d6,d5               ;d5-1 = bottom line rel to curr
  14976.  subq.w #1,d5
  14977.  beq .wait                 ;go if curr on bottom line
  14978. .dlbn:
  14979.  tst.b (a1)+               ;to next line
  14980.  bne .dlbn
  14981.  cmp.l a0,a1               ;go if past last line
  14982.  bcc .wait
  14983.  subq.w #1,d5              ;until bottom line reached
  14984.  bne .dlbn
  14985.  
  14986.  sub.w #28,a7              ;room for tags
  14987.  move.l a7,a0
  14988.  move.l #xxp_xoffs,(a0)+   ;tag 1: fixed offset
  14989.  clr.w (a0)+
  14990.  move.w .offs(a6),(a0)+
  14991.  move.l #xxp_xtext,(a0)+   ;tag 2: text address
  14992.  move.l a1,(a0)+
  14993.  move.l #xxp_xcrsr,(a0)+   ;tag 3: crsr = -1 (i.e. none)
  14994.  move.l #-1,(a0)+
  14995.  clr.l (a0)
  14996.  moveq #0,d0               ;d0 = xpos
  14997.  move.w .slns(a6),d1
  14998.  subq.w #1,d1
  14999.  mulu .fonh(a6),d1         ;d1 = ypos
  15000.  move.l a7,a0              ;a0 = tags
  15001.  jsr TLReqedit             ;show line
  15002.  add.w #28,a7
  15003.  bra .wait
  15004.  
  15005. .dlls:                     ;if only line, clear it rather than delete
  15006.  move.l .crra(a6),a0
  15007.  clr.b (a0)
  15008.  clr.w .crsr(a6)
  15009.  bra .wait
  15010.  
  15011. .srng:                     ;* Shift/Ctrl/A  -> mark start of range
  15012.  move.l .curr(a6),.rngs(a6)
  15013.  bra .wait
  15014.  
  15015. .erng:                     ;* Shift/Ctrl/Z  -> mark end of range
  15016.  move.l .curr(a6),.rnge(a6)
  15017.  bra .wait
  15018.  
  15019. .newg:                     ;* new the memory
  15020.  move #43,d0
  15021.  moveq #2,d1
  15022.  move.l xxp_Help(a4),-(a7)
  15023.  move.w #220,xxp_Help(a4)
  15024.  move.w #6,xxp_Help+2(a4)
  15025.  bsr TLReqchoose           ;caution user
  15026.  move.l (a7)+,xxp_Help(a4)
  15027.  cmp.w #1,d0
  15028.  bne .wait
  15029. .newc:
  15030.  bsr .new
  15031.  bra .kapt
  15032.  
  15033. .drng:                     ;* Shift/Ctrl/D  -> delete range
  15034.  moveq #40,d0
  15035.  moveq #2,d1
  15036.  move.l xxp_Help(a4),-(a7)
  15037.  move.w #226,xxp_Help(a4)
  15038.  move.w #5,xxp_Help+2(a4)
  15039.  bsr TLReqchoose           ;caution user
  15040.  move.l (a7)+,xxp_Help(a4)
  15041.  cmp.w #1,d0
  15042.  bne .wait
  15043.  
  15044.  bsr .vrng
  15045.  beq .wait                 ;go if bad range
  15046.  
  15047.  ori.b #3,.chnd+3(a6)
  15048.  move.l d1,d2              ;d2 = no. of lines deleted
  15049.  sub.l d0,d2
  15050.  addq.l #1,d2
  15051.  sub.l d2,.lins(a6)        ;deduct from lins
  15052.  beq .newc                 ;if all lines deleted, to new
  15053.  
  15054.  cmp.l .curr(a6),d1
  15055.  bcc.s .drls               ;go if curr <= last line
  15056.  sub.l d2,.curr(a6)        ;else, reduce curr by no. of lines deleted
  15057.  clr.w .crsr(a6)
  15058.  bra.s .drrd
  15059. .drls:
  15060.  cmp.l .curr(a6),d0        ;go if curr < 1st line
  15061.  bhi.s .drrd
  15062.  move.l d0,.curr(a6)       ;curr is in range - make curr = start of range
  15063.  clr.w .crsr(a6)
  15064.  cmp.l .lins(a6),d0
  15065.  bne.s .drrd
  15066.  subq.l #1,.curr(a6)       ;range extends to last line, curr befor range
  15067. .drrd:
  15068.  move.l .mmem(a6),a0       ;a0 finds start of range
  15069.  bra.s .drsn
  15070. .drsf:
  15071.  tst.b (a0)+
  15072.  bne .drsf
  15073. .drsn:
  15074.  subq.l #1,d0
  15075.  bpl .drsf
  15076.  move.l a0,a1              ;a1 finds end of range
  15077. .dref:
  15078.  tst.b (a1)+
  15079.  bne .dref
  15080.  subq.l #1,d2
  15081.  bne .dref
  15082.  move.l .mtop(a6),a2       ;a2 = old memtop
  15083.  bra.s .drtn
  15084. .drtf:
  15085.  move.b (a1)+,(a0)+        ;tfr next byte down
  15086. .drtn:
  15087.  cmp.l a2,a1               ;until old memtop reached
  15088.  bcs .drtf
  15089.  move.l a0,.mtop(a6)       ;note new memtop
  15090.  move.l #-1,.rngs(a6)
  15091.  move.l #-1,.rnge(a6)
  15092.  bra .kapt
  15093.  
  15094. .irng:                     ;* Shift/Ctrl/I  -> insert range
  15095.  bsr .vrng
  15096.  beq .wait                 ;go if range invalid
  15097.  move.l .curr(a6),d2       ;d0 = start; d1 = end; d2 = curr
  15098.  cmp.l d0,d2
  15099.  bcs.s .irgd               ;ok if curr < start
  15100.  cmp.l d2,d1
  15101.  bcc .irbd                 ;bad if  start <= curr <= end
  15102. .irgd:
  15103.  move.l .mmem(a6),a0       ;point a0 to start of range (a0 = what to insert)
  15104.  move.l d0,d2
  15105.  bra.s .irgn
  15106. .irgs:
  15107.  tst.b (a0)+
  15108.  bne .irgs
  15109. .irgn:
  15110.  subq.l #1,d2
  15111.  bpl .irgs
  15112.  move.l a0,a1              ;point a1 past end of range
  15113.  move.l d1,d2
  15114.  sub.l d0,d2
  15115. .irge:
  15116.  tst.b (a1)+
  15117.  bne .irge
  15118.  subq.l #1,d2
  15119.  bpl .irge
  15120.  move.l .mtop(a6),a2       ;a2 = old memtop
  15121.  move.l a1,d3
  15122.  sub.l a0,d3               ;d3 = bytes in range
  15123.  move.l a2,a3              ;a3 = proposed new memtop
  15124.  add.l d3,a3
  15125.  cmp.l .fdir(a6),a3
  15126.  bhi.s .irom               ;go if text out of mem
  15127.  
  15128.  ori.b #3,.chnd+3(a6)
  15129.  move.l a3,.mtop(a6)       ;fix memtop
  15130.  move.l d1,d2
  15131.  sub.l d0,d2
  15132.  addq.l #1,d2              ;d2 = lines in range
  15133.  move.l .crra(a6),a1       ;create a hole at crra (a1 = insertion point)
  15134. .irtf:
  15135.  move.b -(a2),-(a3)        ;tfr a byte forward
  15136.  cmp.l a1,a2               ;until insertion point reached
  15137.  bhi .irtf
  15138.  add.l d2,.lins(a6)        ;fix number of lines
  15139.  cmp.l a0,a1               ;compare insertion point - old range start
  15140.  bcc.s .iris               ;go if inserting forward
  15141.  add.l d3,a0               ;inserting backward - bump range start
  15142.  add.l d2,.rngs(a6)        ;                     bump range linums
  15143.  add.l d2,.rnge(a6)
  15144. .iris:
  15145.  move.b (a0)+,(a1)+        ;transfer range to insertion point
  15146.  subq.l #1,d3
  15147.  bne .iris
  15148.  bra .kapt
  15149. .irom:                     ;report error - out of memory
  15150.  moveq #46,d0
  15151.  bra.s .irrp
  15152. .irbd:                     ;report error - can't insert within own compass
  15153.  moveq #39,d0
  15154. .irrp:
  15155.  moveq #1,d1
  15156.  moveq #0,d2
  15157.  move.l xxp_Help(a4),-(a7)
  15158.  move.w #231,xxp_Help(a4)
  15159.  move.w #15,xxp_Help+2(a4)
  15160.  bsr TLReqinfo
  15161.  move.l (a7)+,xxp_Help(a4)
  15162.  bra .wait
  15163.  
  15164. ; Multiline - miscellaneous keys pressed
  15165.  
  15166. .othr:                     ;* misc keyboard presses
  15167.  cmp.b #$0D,d0
  15168.  beq .wait                 ;recycle if return (the usual)
  15169.  cmp.b #$1B,d0
  15170.  beq .done                 ;quit if Esc
  15171.  cmp.b #$93,d0
  15172.  beq .done                 ;quit if close window
  15173.  cmp.b #$97,d0
  15174.  beq .done                 ;quit if inactive window
  15175.  bra .wait                 ;ignore others
  15176.  
  15177. .scoz:                     ;* scroller message - locked
  15178.  move.l xxp_scrl(a5),d0
  15179.  beq .wait                 ;ignore if no scroller (can't get here?)
  15180.  
  15181.  move.l d0,a0
  15182.  sub.w .offs(a6),d1        ;d1 = change to offs
  15183.  beq.s .scol               ;try vert if no horz change
  15184.  bmi.s .scou
  15185.  cmp.w #8,d1               ;increase: if < 8, make 8
  15186.  bcc.s .scop
  15187.  moveq #8,d1
  15188.  bra.s .scop
  15189. .scou:
  15190.  neg.w d1                  ;decrease: if < 8, make 8
  15191.  cmp.w #8,d1
  15192.  bcc.s .scon
  15193.  moveq #8,d1
  15194. .scon:
  15195.  neg.w d1
  15196. .scop:
  15197.  add.w d1,.offs(a6)        ;update offs
  15198.  bpl.s .scp0
  15199.  clr.w .offs(a6)           ;offs = 0 if < 0
  15200. .scp0:
  15201.  move.l xxp_hztt(a0),d0    ;d0 = max allowable offs
  15202.  sub.l xxp_hzvs(a0),d0
  15203.  cmp.w .offs(a6),d0
  15204.  bcc.s .scp2
  15205.  move.w d0,.offs(a6)       ;offs = max allowable if > max
  15206. .scp2:
  15207.  move.w .offs(a6),xxp_hztp+2(a0)
  15208.  bsr TLWslof               ;ignore futher messages
  15209.  bra .nsls                 ;& update display
  15210.  
  15211. .scol:                     ;* scroller message
  15212.  move.l xxp_scrl(a5),d0
  15213.  beq .wait                 ;ignore if no scroller (can't get here?)
  15214.  
  15215.  move.l d0,a0              ;a0 = slider gadget data
  15216.  move.l .topl(a6),d2       ;d2 = old topl
  15217.  moveq #0,d7
  15218.  move.w .slns(a6),d7       ;d7 = slns
  15219.  move.l xxp_vttp(a0),d0    ;d0 = new topl
  15220.  move.l d2,xxp_vttp(a0)    ;(keep old in case only crra moves)
  15221.  cmp.w #3,d3
  15222.  beq .up1                  ;go if up a step
  15223.  cmp.w #4,d3
  15224.  beq .dw1                  ;go if down a step
  15225.  move.l d0,d4
  15226.  
  15227.  sub.l d2,d4               ;d4 = new - old
  15228.  beq .wait                 ;ignore if new = old
  15229.  
  15230.  bsr TLWslof               ;clear other messages since slow
  15231.  move.l d0,.topl(a6)       ;note new topl
  15232.  tst.w .lock(a6)
  15233.  beq.s .scnl               ;go if unlocked
  15234.  move.l d0,.curr(a6)       ;else, put curr at topl
  15235.  bra .kapt
  15236.  
  15237. .scnl:
  15238.  move.l .curr(a6),d1
  15239.  sub.l d0,d1               ;d1 = curr - new topl
  15240.  bmi.s .sclf               ;new curr if d1<0
  15241.  cmp.l d7,d1
  15242.  bcs .nsls                 ;ok if d1 < slns
  15243. .sclf:
  15244.  move.l d0,.curr(a6)       ;new curr (= topl)
  15245.  cmp.l d2,d0
  15246.  bcs .kapt                 ;ok if new topl < old topl
  15247.  add.l d7,d0
  15248.  subq.l #1,d0              ;else, put curr at bot of window
  15249.  cmp.l .lins(a6),d0
  15250.  bcs .kapt
  15251.  move.l d0,.curr(a6)
  15252.  bra .kapt
  15253.  
  15254. .clik:                     ;* window clicked
  15255.  move.l xxp_kybd+4(a4),d0
  15256.  move.l xxp_kybd+8(a4),d1  ;d0,d1 = mouse xpos, ypos
  15257.  sub.w xxp_LeftEdge(a5),d0
  15258.  bcs .wait
  15259.  sub.w xxp_TopEdge(a5),d1  ;ignore if off printable area
  15260.  bcs .wait
  15261.  cmp.w xxp_PWidth(a5),d0
  15262.  bcc .wait
  15263.  cmp.w xxp_PHeight(a5),d1
  15264.  bcc .wait
  15265.  divu .fonh(a6),d1         ;d1 = line clicked rel to topline
  15266.  and.l #$FFFF,d1
  15267.  add.l .topl(a6),d1        ;d1 = line num clicked
  15268.  cmp.l .lins(a6),d1
  15269.  bcc .wait                 ;go if no such line
  15270.  move.l d1,.curr(a6)       ;d1 = curr
  15271.  move.w d0,.kybd(a6)       ;d0 = crsr xpos in pixels
  15272.  move.l .tpla(a6),a0
  15273.  sub.l .topl(a6),d1
  15274.  bra.s .clkf
  15275. .clkn:
  15276.  tst.b (a0)+               ;find new .crra
  15277.  bne .clkn
  15278. .clkf:
  15279.  dbra d1,.clkn
  15280.  move.l a0,.crra(a6)       ;set .crra
  15281.  bra .wait
  15282.  
  15283. ; Multiline - respond to menu selections
  15284.  
  15285. .mens:                     ;* menu select
  15286.  move.l xxp_kybd+4(a4),d0  ;d0 = menu
  15287.  bmi .wait
  15288.  move.l xxp_kybd+8(a4),d1  ;d1 = menu item
  15289.  cmp.w #1,d0
  15290.  bcs.s .men0
  15291.  beq.s .men1
  15292.  cmp.w #3,d0
  15293.  bcs .men2
  15294.  beq .men3
  15295.  bra .wait                 ;(can't be menu 4 - menu 4 coopted by Reqedit)
  15296.  
  15297. .men0:                     ;menu 0...
  15298.  cmp.w #1,d1
  15299.  bcs .load                 ;#0 load
  15300.  beq .save                 ;#1 save
  15301.  cmp.w #3,d1
  15302.  beq .svas                 ;#3 save as
  15303.  cmp.w #5,d1
  15304.  beq .mprt                 ;#5 print
  15305.  cmp.w #7,d1
  15306.  beq .abut                 ;#7 about
  15307.  cmp.w #9,d1
  15308.  bcs .gprf                 ;#8 gui prefs
  15309.  beq .guig                 ;#9 guide
  15310.  cmp.w #11,d1
  15311.  bcs .lkul                 ;#10 lock/unlock
  15312.  cmp.w #12,d1
  15313.  beq .done                 ;#12 stop
  15314.  bra .wait
  15315.  
  15316. .men1:                     ;menu 1...
  15317.  cmp.w #1,d1
  15318.  bcs .frst                 ;#0 1st line
  15319.  beq .last                 ;#1 last line
  15320.  cmp.w #3,d1
  15321.  bcs .skfw                 ;#2 seek forward
  15322.  beq .skbk                 ;#3 seek back
  15323.  cmp.w #5,d1
  15324.  bcs .sklf                 ;#4 seek left
  15325.  beq .dwwd                 ;#5 down a window-full
  15326.  cmp.w #7,d1
  15327.  bcs .upwd                 ;#6 up a window-full
  15328.  beq .lnum                 ;#7 line number
  15329.  cmp.w #9,d1
  15330.  bcs .info                 ;#8 info
  15331.  bra .wait
  15332.  
  15333. .men2:                     ;menu 2...
  15334.  cmp.w #1,d1
  15335.  bcs .ilin                 ;#0 insert line
  15336.  beq .dlin                 ;#1 delete line
  15337.  cmp.w #3,d1
  15338.  beq .srng                 ;#3 range start
  15339.  cmp.w #5,d1
  15340.  bcs .erng                 ;#4 range end
  15341.  beq .irng                 ;#5 insert range
  15342.  cmp.w #7,d1
  15343.  bcs .drng                 ;#6 delete range
  15344.  cmp.w #9,d1
  15345.  bcs .svrg                 ;#8 save range
  15346.  beq .ifil                 ;#9 insert file
  15347.  cmp.w #11,d1
  15348.  beq .rwrp                 ;#11 rewrap range
  15349.  cmp.w #13,d1
  15350.  bcs .gmax                 ;#12 change max line len
  15351.  beq .spel                 ;#13 spell check range
  15352.  cmp.w #16,d1
  15353.  beq .newg                 ;#16 new
  15354.  bra .wait
  15355.  
  15356. .men3:                     ;menu 3...
  15357.  tst.w d1
  15358.  beq .font                 ;#0 font
  15359.  bra .wait                 ;else ignore
  15360.  
  15361. .load:                     ;* load
  15362.  bsr .ldfl                 ;open file
  15363.  beq .wait                 ;bad if can't
  15364.  bsr TLBusy
  15365.  bset #0,.chnd+3(a6)       ;mark as changed
  15366.  bclr #1,.chnd+3(a6)       ;mark as saved
  15367.  move.l .mmem(a6),d2
  15368.  move.l .fdir(a6),d3
  15369.  sub.l d2,d3
  15370.  jsr TLReadfile            ;read file
  15371.  beq.s .ldbd               ;go if bad read (leave old contents intact??)
  15372.  jsr TLClosefile
  15373.  tst.l d0
  15374.  ble.s .ldnl               ;go if null read (leave old contents intact)
  15375.  
  15376.  move.l d0,a0
  15377.  add.l .mmem(a6),a0
  15378.  move.l a0,.mtop(a6)       ;note new mtop
  15379.  clr.b -1(a0)              ;make sure last line has eol
  15380.  cmp.l d3,d0
  15381.  bcc.s .ldtr               ;go if file too big (truncate)
  15382.  bra.s .ldgd
  15383. .ldbd:                     ;report can't read
  15384.  moveq #84,d0
  15385.  bra.s .ldrp
  15386. .ldtr:                     ;report truncated
  15387.  moveq #85,d0
  15388.  bra.s .ldrp
  15389. .ldnl:                     ;report null read
  15390.  moveq #87,d0
  15391. .ldrp:
  15392.  moveq #1,d1
  15393.  moveq #0,d2
  15394.  move.l xxp_Help(a4),-(a7)
  15395.  clr.l xxp_Help(a4)
  15396.  bsr TLReqinfo
  15397.  move.l (a7)+,xxp_Help(a4)
  15398. .ldgd:                     ;wrap up the load
  15399.  clr.l .topl(a6)
  15400.  clr.l .curr(a6)
  15401.  clr.w .crsr(a6)
  15402.  clr.w .valc(a6)
  15403.  bsr .vald                 ;validate after bad/trunc/null
  15404.  bsr TLUnbusy
  15405.  bra .kapt
  15406.  
  15407. .save:                     ;* save
  15408.  bsr .any
  15409.  beq .sgb1                 ;quit if mmem empty
  15410.  bsr .svfl
  15411.  beq .svas                 ;if can't open -> save as
  15412.  bra .sapk                 ;else, pick up svas where file open
  15413.  
  15414. .svas:                     ;* save as
  15415.  bsr .any
  15416.  beq .sgb1                 ;quit if mmem empty
  15417.  bsr .safl
  15418.  beq .wait                 ;quit if can't open
  15419.  
  15420. .sapk:
  15421.  bsr TLBusy
  15422.  bsr .exit                 ;replace $00's by $0A's
  15423.  move.l .mmem(a6),d2
  15424.  move.l .mtop(a6),d3
  15425.  sub.l d2,d3
  15426.  jsr TLWritefile           ;write file
  15427.  beq.s .sabd
  15428.  bclr #1,.chnd+3(a6)       ;signal saved
  15429.  bra.s .saok
  15430. .sabd:
  15431.  moveq #83,d0
  15432.  moveq #1,d1
  15433.  moveq #0,d2
  15434.  move.l xxp_Help(a4),-(a7)
  15435.  clr.l xxp_Help(a4)
  15436.  bsr TLReqinfo             ;report if bad write
  15437.  move.l (a7)+,xxp_Help(a4)
  15438. .saok:
  15439.  bsr .ntry                 ;replace $0A's by $00's
  15440.  jsr TLClosefile           ;close file
  15441.  bsr TLUnbusy
  15442.  bra .wait
  15443.  
  15444. .mprt:                     ;* print &&&&
  15445.  move.w #290,xxp_Help(a4)
  15446.  move.w #10,xxp_Help+2(a4)
  15447.  move.l #272,d0
  15448.  moveq #5,d1
  15449.  bsr TLReqchoose           ;choose task
  15450.  cmp.w #1,d0
  15451.  bcs .wait
  15452.  beq.s .pqrg
  15453.  cmp.w #3,d0
  15454.  bcs.s .pqcr
  15455.  beq.s .pqaa
  15456.  cmp.w #5,d0
  15457.  bcc .wait
  15458.  
  15459.  bsr .pprf                 ;set printer prefs
  15460.  bra .mprt
  15461.  
  15462. .pqrg:                     ;print range
  15463.  bsr .vrng                 ;set d0,d1 = start,end of range
  15464.  beq .wait                 ;go if range invalid
  15465.  bra.s .pqpk
  15466. .pqcr:                     ;print all from current
  15467.  move.l .curr(a6),d0
  15468.  bra.s .pqac
  15469. .pqaa:                     ;print all
  15470.  moveq #0,d0
  15471. .pqac:
  15472.  move.l .lins(a6),d1
  15473.  subq.l #1,d1
  15474. .pqpk:                     ;* print lines d0-d1
  15475.  move.l d0,.pqal(a6)
  15476.  move.l d1,.pqzz(a6)
  15477.  bsr .pqdo                 ;do the print job
  15478.  bra .kapt
  15479.  
  15480. .abut:                     ;* about
  15481.  bsr .abot
  15482.  bra .wait
  15483.  
  15484. .guig:                     ;* view AmigaGuide
  15485.  bsr .guid
  15486.  bsr TLWslof
  15487.  bra .wait
  15488.  
  15489. .gprf:                     ;* GUI prefs
  15490.  moveq #-1,d0
  15491.  jsr TLPrefs
  15492.  bra .wait
  15493.  
  15494. .lkul:                     ;* lock / unlock
  15495.  clr.w .offs(a6)
  15496.  move.w .lock(a6),d0
  15497.  eori.w #-1,d0
  15498.  move.w d0,.lock(a6)       ;switch .lock
  15499.  beq.s .lkok
  15500.  move.w #173,d0            ;report now locked
  15501.  move.w #171,xxp_Help(a4)
  15502.  move.w #1,xxp_Help+2(a4)
  15503. .lkrp:
  15504.  moveq #1,d1
  15505.  moveq #1,d2
  15506.  bsr TLReqinfo
  15507.  bsr .able                 ;update menu on/offs
  15508.  bra .nsls
  15509. .lkok:
  15510.  move.l xxp_scrl(a5),a0
  15511.  clr.l xxp_hztp(a0)        ;annul horz scroller if now unlocked
  15512.  move.l #2048,xxp_hzvs(a0)
  15513.  moveq #0,d0
  15514.  moveq #1,d1
  15515.  bsr TLWscroll
  15516.  move.w #174,d0            ;report now unlocked
  15517.  bra .lkrp
  15518.  
  15519. .skfw:                     ;* seek forward
  15520.  bsr .sfwd
  15521.  bra .nsls
  15522.  
  15523. .skbk:                     ;* seek back
  15524.  bsr .sbak
  15525.  bra .nsls
  15526.  
  15527. .sklf:                     ;* seek left
  15528.  bsr .slef
  15529.  bra .nsls
  15530.  
  15531. .lnum                      ;* go to line number
  15532.  move.w #131,d0
  15533.  jsr TLStra0               ;point d0 to local string 131
  15534.  sub.w #64,a7              ;set up strings in a7 (so can change)
  15535.  move.l a7,a1
  15536.  move.l a1,xxp_strg(a4)
  15537.  clr.b (a1)+
  15538. .lnst:
  15539.  move.b (a0)+,(a1)+
  15540.  bne .lnst
  15541.  move.l a1,a0              ;put num of last string in limit
  15542.  move.b #' ',-1(a0)
  15543.  move.l .lins(a6),d0
  15544.  jsr TLHexasc
  15545.  clr.b (a0)
  15546.  clr.b (a4)
  15547.  moveq #1,d0               ;get lnum required
  15548.  moveq #-1,d1
  15549.  moveq #8,d2
  15550.  moveq #0,d3
  15551.  move.l xxp_Help(a4),-(a7)
  15552.  clr.l xxp_Help(a4)
  15553.  bsr TLReqinput
  15554.  move.l (a7)+,xxp_Help(a4)
  15555.  add.w #64,a7
  15556.  move.l #.str,xxp_strg(a4)
  15557.  tst.l d0
  15558.  beq .wait                 ;retry if cancel
  15559.  move.l xxp_valu(a4),d0
  15560.  subq.l #1,d0              ;make result rel to 0
  15561.  bmi .lnum
  15562.  cmp.l .lins(a6),d0
  15563.  bcc .lnum                 ;go if bad lnum
  15564.  move.l d0,.curr(a6)
  15565.  clr.w .crsr(a6)
  15566.  bra .kapt                 ;go there
  15567.  
  15568. .info:                     ;* info re text
  15569.  bsr .data
  15570.  bra .wait
  15571.  
  15572. .ilin:                     ;* insert line
  15573.  move.l .crra(a6),a2       ;a2 = crra
  15574.  move.l .mtop(a6),a0
  15575.  cmp.l .fdir(a6),a0        ;ignore if out of mem
  15576.  bcc .wait
  15577.  ori.b #3,.chnd+3(a6)
  15578.  addq.l #1,.mtop(a6)       ;fix mtop
  15579.  move.l a0,a1
  15580.  addq.l #1,a1              ;tfr up a byte down to crra
  15581. .ilcu:
  15582.  move.b -(a0),-(a1)
  15583.  cmp.l a2,a0
  15584.  bhi .ilcu
  15585.  clr.b (a0)                ;blank line at crra
  15586.  clr.w .crsr(a6)           ;fix crsr
  15587.  addq.l #1,.lins(a6)       ;fix lins
  15588.  bra .nsls
  15589.  
  15590. .svrg:                     ;* save range
  15591.  bsr .vrng
  15592.  beq .wait                 ;quit if none
  15593.  bsr .any
  15594.  beq .sgb1                 ;quit if mmem empty
  15595.  
  15596.  move.l .fdir(a6),a0       ;(cache old fil,dir)
  15597.  sub.w #164,a7
  15598.  move.l a7,a1
  15599.  moveq #40,d0
  15600. .svrs:
  15601.  move.l (a0)+,(a1)+
  15602.  dbra d0,.svrs
  15603.  
  15604.  bsr .safl                 ;open file
  15605.  
  15606.  move.l a7,a0              ;(restore old fil,dir)
  15607.  move.l .fdir(a6),a1
  15608.  move.l d0,-(a7)
  15609.  moveq #40,d0
  15610. .svrr:
  15611.  move.l (a0)+,(a1)+
  15612.  dbra d0,.svrr
  15613.  move.l (a7)+,d0
  15614.  add.w #164,a7
  15615.  
  15616.  beq .wait                 ;quit if can't open
  15617.  move.l .mmem(a6),a0
  15618.  move.l .rngs(a6),d0
  15619.  beq.s .svr1
  15620. .svr0:
  15621.  tst.b (a0)+               ;find start of range
  15622.  bne .svr0
  15623.  subq.l #1,d0
  15624.  bne .svr0
  15625. .svr1:
  15626.  move.l a0,d2              ;d2 = start of range
  15627.  move.l .rnge(a6),d0
  15628.  sub.l .rngs(a6),d0
  15629. .svr2:
  15630.  tst.b (a0)+               ;find end of range
  15631.  bne .svr2
  15632.  subq.l #1,d0
  15633.  bpl .svr2
  15634.  move.l a0,d3              ;d3 = end of rng - start of rng = bytes in range
  15635.  sub.l d2,d3
  15636.  bsr .exit                 ;(change $0's to $A's)
  15637.  jsr TLWritefile
  15638.  beq.s .sgb2
  15639.  jsr TLClosefile           ;close file
  15640.  bsr .ntry                 ;(change $A's to $0's)
  15641.  bra .wait
  15642.  
  15643. .sgb1:                     ;bad 1: file empty
  15644.  moveq #86,d0
  15645.  bra.s .sgbd
  15646.  
  15647. .sgb2:                     ;bad 2: can't write
  15648.  bsr .ntry                 ;       (change $A's to $0's)
  15649.  moveq #83,d0
  15650.  
  15651. .sgbd:
  15652.  moveq #1,d1
  15653.  moveq #0,d2
  15654.  move.l xxp_Help(a4),-(a7)
  15655.  clr.l xxp_Help(a4)
  15656.  bsr TLReqinfo
  15657.  move.l (a7)+,xxp_Help(a4)
  15658.  bra .wait
  15659.  
  15660. .ifil:                     ;* insert file
  15661.  bsr .any
  15662.  beq .load                 ;-> load if mmem empty
  15663.  
  15664.  move.l .fdir(a6),a0       ;(cache old fil,dir)
  15665.  sub.w #164,a7
  15666.  move.l a7,a1
  15667.  moveq #40,d0
  15668. .ifis:
  15669.  move.l (a0)+,(a1)+
  15670.  dbra d0,.ifis
  15671.  
  15672.  bsr .ldfl                 ;open file
  15673.  
  15674.  move.l a7,a0              ;(restore old fil,dir)
  15675.  move.l .fdir(a6),a1
  15676.  move.l d0,-(a7)
  15677.  moveq #40,d0
  15678. .ifir:
  15679.  move.l (a0)+,(a1)+
  15680.  dbra d0,.ifir
  15681.  move.l (a7)+,d0
  15682.  add.w #164,a7
  15683.  
  15684.  beq .wait                 ;quit if can't open file
  15685.  bsr TLBusy
  15686.  ori.b #3,.chnd+3(a6)
  15687.  move.l .crra(a6),a2
  15688.  move.l .mtop(a6),a0       ;move mem from crra to top of memory
  15689.  move.l .fdir(a6),a1
  15690. .ifup:
  15691.  move.b -(a0),-(a1)
  15692.  cmp.l a2,a0
  15693.  bhi .ifup
  15694.  move.l a2,d2              ;read file into hole thus created
  15695.  move.l a1,d3
  15696.  sub.l d2,d3
  15697.  jsr TLReadfile
  15698.  beq.s .ifbr               ;go if bad read
  15699.  tst.l d0
  15700.  bne.s .ifgt               ;go if >0 bytes read ok
  15701.  move.w #134,d0
  15702.  bra.s .ifrp               ;report 0 bytes read
  15703. .ifbr:
  15704.  move.w #133,d0            ;report bad read
  15705. .ifrp:
  15706.  moveq #1,d1
  15707.  moveq #0,d2
  15708.  move.l xxp_Help(a4),-(a7)
  15709.  clr.l xxp_Help(a4)
  15710.  bsr TLReqinfo
  15711.  move.l (a7)+,xxp_Help(a4)
  15712.  moveq #0,d0               ;d0 = 0 if bad read / no bytes read
  15713. .ifgt:
  15714.  jsr TLClosefile           ;close file
  15715.  add.l d0,a2               ;point a2 to crra + bytes read
  15716.  move.l .fdir(a6),a0
  15717. .iftf:
  15718.  move.b (a1)+,(a2)+        ;move rest of file down to fill the gap
  15719.  cmp.l a0,a1
  15720.  bcs .iftf
  15721.  move.l a2,.mtop(a6)       ;note new mtop
  15722.  bsr TLUnbusy
  15723.  tst.l d0
  15724.  beq .nsls                 ;go if nothing read
  15725.  clr.w .valc(a6)
  15726.  bsr .vald                 ;else validate, re-check everything
  15727.  bra .kapt
  15728.  
  15729. ; Multline - rewrap
  15730.  
  15731. .rwrp:                     ;* rewrap range
  15732.  move.w #263,xxp_Help(a4)
  15733.  move.w #9,xxp_Help+2(a4)
  15734.  move.w #258,d0
  15735.  moveq #4,d1
  15736.  bsr TLReqchoose           ;choose para/all/range/canc
  15737.  cmp.w #1,d0
  15738.  bcs .wait
  15739.  beq.s .rwpc
  15740.  cmp.w #3,d0
  15741.  beq.s .rwpr
  15742.  bcc .wait
  15743.  
  15744.  clr.l .rngs(a6)           ;rewrap all
  15745.  move.l .lins(a6),d0
  15746.  bra.s .rwpe
  15747.  
  15748. .rwpc:                     ;rewrap current line to next blank line
  15749.  move.l .curr(a6),d0
  15750.  move.l d0,.rngs(a6)
  15751.  move.l .crra(a6),a0
  15752. .rwpf:
  15753.  tst.b (a0)+
  15754.  bne .rwpf
  15755.  addq.l #1,d0
  15756.  cmp.l .lins(a6),d0
  15757.  beq.s .rwpe
  15758.  tst.b (a0)
  15759.  bne .rwpf
  15760. .rwpe:
  15761.  subq.l #1,d0
  15762.  move.l d0,.rnge(a6)
  15763.  
  15764. .rwpr:                     ;rewrap range
  15765.  bsr .vrng
  15766.  beq .wait                 ;go if range invalid
  15767.  move.l .lins(a6),.work(a6)  ;remember old .lins value
  15768.  bsr TLBusy                ;busy pointer
  15769.  
  15770. ;set up registers
  15771.  move.l d0,.curr(a6)       ;leave curr,topl at start of range
  15772.  move.l d0,.topl(a6)
  15773.  move.l d1,d7              ;d7 counts input lines
  15774.  sub.l d0,d7
  15775.  addq.l #1,d7
  15776.  move.w .mmxc(a6),d6       ;d6 = mmxc
  15777.  moveq #0,d5               ;d5 counts chrs so far in output lines
  15778.  move.l d0,d4              ;d4 counts output linum
  15779.  move.l d0,d3              ;d3 counts input linum
  15780.  moveq #0,d2               ;d2 = ltyp of op line
  15781.  
  15782. ;move input lines to top of mem
  15783.  move.l .mmem(a6),a2
  15784.  bra.s .rw0n
  15785. .rw0f:                     ;point a2 to 1st line of range
  15786.  tst.b (a2)+
  15787.  bne .rw0f
  15788. .rw0n:
  15789.  subq.l #1,d0
  15790.  bpl .rw0f
  15791.  move.l a2,.crra(a6)       ;set crra to start of range
  15792.  move.l .mtop(a6),a1       ;move all from range start to top of mem
  15793.  move.l .fdir(a6),a0
  15794. .rwhl:
  15795.  move.b -(a1),-(a0)
  15796.  cmp.l a2,a1               ;a0 gets input, a1 gets output
  15797.  bhi .rwhl
  15798.  
  15799. ; process next input line...
  15800. .rwip:                     ;* get next input line
  15801.  move.l a0,d0
  15802.  sub.l a1,d0               ;d0 = gap between input & output
  15803.  cmp.l #20,d0              ;out of mem of < 20
  15804.  bcs .rwom
  15805.  tst.b (a0)                ;go if input line null
  15806.  beq .rwe0
  15807.  cmp.b #32,(a0)            ;go if input line starts with space
  15808.  beq .rwe1
  15809.  
  15810. ; preview next word of input line
  15811. .rwnw:
  15812.  move.l a0,d1              ;d1 remembers starting a0
  15813.  cmp.b #32,(a0)
  15814.  beq .rw2s                 ;go if "word" start with space
  15815. .rwwl:
  15816.  tst.b (a0)+               ;look at next byte
  15817.  beq.s .rwwe               ;go if eol
  15818.  cmp.b #32,-1(a0)          ;until eol/space found
  15819.  bne .rwwl
  15820. .rwwe:
  15821.  subq.l #1,a0              ;point a0 back to eol/space
  15822.  move.l a0,d0
  15823.  sub.l d1,d0               ;d0 = bytes in word        } if spc at start, a
  15824.  move.l d1,a0              ;a0 back to start of word  } 1 byte "word"
  15825.  moveq #0,d1
  15826.  tst.l d5
  15827.  beq.s .rwwc               ;don't prepend space if: - new output line
  15828.  cmp.b #32,-1(a1)          ;                        - last output chr is spc
  15829.  beq.s .rwwc
  15830.  moveq #1,d1               ;d1=1 if output line will prepend space
  15831.  addq.w #1,d5
  15832. .rwwc:
  15833.  
  15834. ;will the word fit?
  15835.  add.w d0,d5               ;d5 = len of output line, if word (& space) added
  15836.  cmp.w d6,d5               ;will it fit?
  15837.  bgt.s .rwnn               ;go if not
  15838.  cmp.w d0,d5
  15839.  beq.s .rwno               ;go if we are starting a new output line
  15840.  tst.w d1
  15841.  beq.s .rwtr               ;go unless we prepend a space
  15842.  move.b #32,(a1)+          ;prepend a space
  15843.  bra.s .rwtr               ;& go transfer the word
  15844. .rwno:
  15845.  move.l a1,a3              ;starting an output line: a3 = its address
  15846.  
  15847. ; transfer the word to the output line
  15848. .rwtr:
  15849. .rwtf:
  15850.  move.b (a0)+,(a1)+        ;transfer the word to the output line
  15851.  subq.w #1,d0
  15852.  bne .rwtf
  15853.  tst.b (a0)+               ;input line ended?
  15854.  beq.s .rwei               ;yes, go
  15855.  bra .rwnw                 ;no, try to append next word
  15856.  
  15857. ; word would not fit in output line
  15858. .rwnn:
  15859.  sub.w d0,d5               ;d5 is at it was before attempting to  add word
  15860.  sub.w d1,d5
  15861.  bne .rweo                 ;go if d5 was not empty
  15862.  move.w d6,d0              ;new line was empty: so word will never fit
  15863. .rwch:
  15864.  move.b (a0)+,(a1)+
  15865.  subq.w #1,d0              ;so, add as much of the word as will fit, &
  15866.  bne .rwch                 ;                      start new output line
  15867. .rweo:
  15868.  bsr .rwtl                 ;remove trailing spaces
  15869.  clr.b (a1)+               ;end the output line
  15870.  moveq #0,d5               ;show none in progress
  15871.  addq.l #1,.lins(a6)       ;bump the line count
  15872.  addq.l #1,d4              ;bump the output line number
  15873.  bra .rwnw                 ;& go to next word of input line
  15874.  
  15875. ; input line ended
  15876. .rwei:
  15877.  subq.l #1,.lins(a6)       ;dec lines count
  15878.  addq.l #1,d3              ;bump input line number
  15879.  subq.l #1,d7              ;dec lines in range count
  15880.  bne .rwip                 ;go to next line if morw
  15881.  
  15882. ; no more input lines
  15883.  tst.l d5                  ;no more inputs - is an output line partly done?
  15884.  beq .rwwp                 ;no, go wrap up
  15885.  bsr .rwtl                 ;remove trailing spaces
  15886.  clr.b (a1)+               ;yes, put an eol for it (don't care about d4,d5)
  15887.  addq.l #1,.lins(a6)       ;bump lins
  15888.  bra .rwwp                 ;go wrap up
  15889.  
  15890. ; null input line found
  15891. .rwe0:
  15892.  tst.w d5                  ;go if no output line in progress
  15893.  beq.s .rwe2
  15894.  bsr .rwtl                 ;remove trailing spaces
  15895.  clr.b (a1)+               ;else, finish output line
  15896.  moveq #0,d5               ;show no output line in progress
  15897.  addq.l #1,d4              ;bump output line number
  15898.  addq.l #1,.lins(a6)       ;bump lins
  15899. .rwe2:
  15900.  addq.l #1,a0              ;bump past input eol
  15901.  clr.b (a1)+               ;send blank output line
  15902.  addq.l #1,d4              ;bump output line number
  15903.  addq.l #1,.lins(a6)       ;bump lins
  15904.  moveq #0,d2               ;force ltyp mismatch next input line
  15905.  bra .rwei                 ;go input line ended
  15906.  
  15907. ;input line starts with space
  15908. .rwe1:
  15909.  moveq #0,d2               ;force ltyp mismatch next line
  15910.  tst.w d5                  ;go if no output line in progress
  15911.  beq.s .rwe3
  15912. .rwp1:
  15913.  bsr .rwtl                 ;remove trailing spaces
  15914.  clr.b (a1)+               ;else, finish output line
  15915.  addq.l #1,d4              ;bump output line number
  15916.  addq.l #1,.lins(a6)       ;bump lins
  15917. .rwe3:
  15918.  move.l a1,a3              ;record start of output line
  15919.  moveq #1,d5               ;note 1 chr in it
  15920. .rwp2:
  15921.  moveq #1,d0
  15922.  move.b (a0)+,(a1)+        ;put the space in the output line
  15923.  bra .rwnw                 ;& to next input word
  15924.  
  15925. ; here if word starts with space
  15926. .rw2s:
  15927.  tst.w d5                  ;go if op line unstarted
  15928.  beq .rwe3
  15929.  addq.w #1,d5              ;bump chr count
  15930.  cmp.w d6,d5
  15931.  bcs .rwp2                 ;go if room for space
  15932.  bra .rwp1                 ;else, start another line with the space
  15933.  
  15934. ; here if new input line has ltyp mismatch
  15935. .rwep:
  15936.  move.l d0,d2              ;note new ltyp
  15937.  tst.l d5
  15938.  beq .rwnw                 ;go to next word if no output line in progress
  15939.  bsr .rwtl                 ;remove trailing spaces
  15940.  clr.b (a1)+               ;else, finish out line
  15941.  moveq #0,d5               ;note no new output line in progress
  15942.  addq.l #1,d4              ;bump out line number
  15943.  addq.l #1,.lins(a6)       ;bump lins
  15944.  bra .rwnw                 ;& to next word of input line
  15945.  
  15946. ; rewrap has run out of memory
  15947. .rwom:
  15948.  move.w #129,d0            ;report out of memory
  15949.  moveq #1,d1
  15950.  moveq #0,d2
  15951.  move.w #246,xxp_Help(a4)
  15952.  move.w #5,xxp_Help+2(a4)
  15953.  bsr TLReqinfo
  15954.  tst.w d5                  ;go if no output line in progress
  15955.  beq.s .rwwp
  15956.  bsr .rwtl                 ;remove trailing spaces
  15957.  clr.b (a1)+               ;else, finish output line
  15958.  addq.l #1,.lins(a6)       ;bump lins
  15959.  move.l d4,.curr(a6)       ;put output line num reached in curr
  15960.  move.l a3,.crra(a6)       ;put its start address in crra
  15961.  
  15962. ; rewrap done - transfer rest of lines
  15963. .rwwp:
  15964.  move.l .fdir(a6),a2       ;a2 = limit of input
  15965.  bra.s .rwwf
  15966. .rwwn:
  15967.  move.b (a0)+,(a1)+       ;tfr a byte down
  15968. .rwwf:
  15969.  cmp.l a2,a0
  15970.  bcs .rwwn                ;until input reached limit
  15971.  move.l a1,.mtop(a6)      ;record new mtop
  15972.  move.l .rnge(a6),d0
  15973.  add.l .lins(a6),d0
  15974.  sub.l .work(a6),d0
  15975.  move.l d0,.rnge(a6)       ;fix range end (changes by change in lins)
  15976.  bsr TLUnbusy
  15977.  bra .nsls                 ;* the rewrap is finished
  15978.  
  15979. ; Multiline - get maximum line length
  15980.  
  15981. .gmax:
  15982.  move.w #142,d0            ;put lines 142, 143+ in xxp_gide
  15983.  jsr TLStra0
  15984.  
  15985.  move.l xxp_gide(a4),a1
  15986.  move.l a1,xxp_strg(a4)
  15987.  clr.b (a1)+
  15988. .gms1:
  15989.  move.b (a0)+,(a1)+
  15990.  bne .gms1
  15991.  exg a0,a1
  15992.  move.b #' ',-1(a0)
  15993.  moveq #0,d0
  15994.  move.w .mmxc(a6),d0       ;append existing mmxc to lines 142 (= line now)
  15995.  jsr TLHexasc
  15996.  move.b #')',(a0)+
  15997.  clr.b (a0)+
  15998.  exg a0,a1
  15999.  moveq #12,d0              ;now tfr help lines
  16000. .gmtf:
  16001.  move.b (a0)+,(a1)+
  16002.  bne .gmtf
  16003.  dbra d0,.gmtf
  16004.  move.w #2,xxp_Help(a4)    ;set up help
  16005.  move.w #13,xxp_Help+2(a4)
  16006.  moveq #1,d0               ;get new mmxc
  16007.  moveq #-1,d1
  16008.  moveq #3,d2
  16009.  moveq #0,d3
  16010.  clr.b (a4)
  16011.  bsr TLReqinput
  16012.  
  16013.  move.l #.str,xxp_strg(a4)
  16014.  move.w #143,xxp_Help(a4)
  16015.  tst.l d0                  ;go if canc
  16016.  beq .wait
  16017.  move.l xxp_valu(a4),d3    ;reject if <10, >254
  16018.  cmp.w #10,d3
  16019.  bcs .gmax
  16020.  cmp.w #255,d3
  16021.  bcc .gmax
  16022.  cmp.w .mmxc(a6),d3        ;compare new - old
  16023.  beq .wait                 ;go if same
  16024.  bcc.s .gmgt               ;accept if new > old
  16025.  move.w #156,d0
  16026.  moveq #2,d1
  16027.  bsr TLReqchoose           ;new < old: warn
  16028.  cmp.w #1,d0
  16029.  bne .wait                 ;go if cancel
  16030.  move.w d3,.mmxc(a6)       ;set new mmxc
  16031.  clr.l .rngs(a6)           ;put all lines in range
  16032.  move.l .lins(a6),d0
  16033.  subq.l #1,d0
  16034.  move.l d0,.rnge(a6)
  16035.  ori.b #3,.chnd+3(a6)      ;note altered
  16036.  bra .rwrp                 ;& go rewrap
  16037. .gmgt:
  16038.  ori.b #3,.chnd+3(a6)      ;new > old: set new mmxc
  16039.  move.w d3,.mmxc(a6)
  16040.  bra .kapt
  16041.  
  16042. ; Multline - spell check range
  16043.  
  16044. .spel:                     ;* spell check range  ######
  16045.  bsr .vrng
  16046.  beq .wait
  16047.  
  16048.  bra .kapt
  16049.  
  16050. ; Multline - exit bad
  16051.  
  16052. .bad1:                     ;* bad 1 - can't create Mmem
  16053.  addq.l #1,xxp_errn(a4)
  16054.  bra.s .donp
  16055. .bad2:                     ;* bad 2 - can't allocate menu (out of chip ram?)
  16056.  moveq #2,d0
  16057.  bra.s .bad
  16058. .bad3:                     ;* bad 3 - window height < font height
  16059.  moveq #32,d0
  16060. .bad:
  16061.  move.l d0,xxp_errn(a4)
  16062.  
  16063. ; Multiline - exit good
  16064.  
  16065. .done:                     ;* bra here to return good (or bad if errn set)
  16066.  move.l .curr(a6),xxp_Mcrr(a5) ;put final data to window data
  16067.  move.l .topl(a6),xxp_Mtpl(a5)
  16068.  move.w .mmxc(a6),xxp_Mmxc(a5)
  16069.  move.l .mtop(a6),xxp_Mtop(a5)
  16070.  bsr .exit                 ;fill text w. $0A's
  16071. .donp:
  16072.  move.l .chnd(a6),xxp_chnd(a4) ;saved/changed in xxp_chnd
  16073.  move.l .lins(a6),xxp_lins(a4) ;number of lines in xxp_lins
  16074.  add.w #128,a7             ;remove temporary buffer
  16075.  moveq #0,d0               ;* restore window fonts ,&c
  16076.  moveq #0,d1
  16077.  moveq #0,d2
  16078.  move.w 16(a7),d0          ;d0 = orig Fnum
  16079.  move.w 12(a7),d1          ;d1 = orig Fsty
  16080.  bsr TLNewfont             ;set original font, style
  16081.  move.w 14(a7),xxp_Tspc(a5) ;set original Tspc
  16082.  moveq #0,d0
  16083.  move.w 8(a7),d0           ;d0 = orig RFont
  16084.  move.w 0(a7),d1           ;d1 = orig RFsty
  16085.  moveq #1,d2
  16086.  bsr TLNewfont             ;set original font, style
  16087.  moveq #0,d0
  16088.  move.w 10(a7),d0          ;d0 = orig HFont
  16089.  move.w 2(a7),d1           ;d1 = orig HFsty
  16090.  moveq #2,d2
  16091.  bsr TLNewfont             ;set original font, style
  16092.  move.l 4(a7),xxp_RTspc(a5) ;set original RTspc, HTspc
  16093.  add.w #20,a7              ;pop 5 stack items - remove original font data
  16094.  bsr TLReqmuclr            ;Multiline's menu (if any) off
  16095.  move.l xxp_Menu(a5),d0
  16096.  beq.s .muff
  16097.  move.l d0,a0              ;close TLMulitline's menu (if any)
  16098.  move.l xxp_gadb(a4),a6
  16099.  jsr _LVOFreeMenus(a6)
  16100. .muff:
  16101.  move.l (a7)+,d0           ;* restore original menu data
  16102.  move.l (a7)+,xxp_Menu(a5)
  16103.  beq.s .muof               ;go if window had no menu
  16104.  tst.w d0
  16105.  beq.s .muof               ;go if it was off
  16106.  bsr TLReqmuset            ;turn window's menu back on
  16107. .muof:
  16108.  move.l (a7)+,xxp_IText(a5)
  16109.  move.l (a7)+,xxp_FrontPen(a5)
  16110.  move.l (a7)+,xxp_Help(a4) ;restore global help
  16111.  move.l (a7)+,xxp_strg(a4) ;re-attach global strings
  16112.  movem.l (a7)+,d0-d7/a0-a6 ;bad if xxp_errn(a4)<>0
  16113.  rts
  16114.  
  16115. ; Multiline - here in lieu of .edit if text is locked
  16116.  
  16117. .lokt:
  16118.  move.w #159,xxp_Help(a4)  ;set help
  16119.  move.w #12,xxp_Help+2(a4)
  16120.  tst.w .rlok(a6)
  16121.  bne.s .lokc
  16122.  addq.w #1,xxp_Help+2(a4)  ;one more line if unlockable
  16123. .lokc:
  16124.  bsr TLWCheck              ;go if resized
  16125.  bne .nsls
  16126.  jsr TLKeyboard            ;get user response
  16127.  cmp.b #$8E,d0             ;up arrow
  16128.  beq .upar
  16129.  cmp.b #$8F,d0             ;down arrow
  16130.  beq .dnar
  16131.  cmp.b #$95,d0             ;menu
  16132.  beq .mens
  16133.  btst #3,d3                ;Ctrl
  16134.  bne.s .lkct
  16135.  cmp.b #$1B,d0             ;quit if Esc
  16136.  beq .done
  16137.  cmp.b #$93,d0             ;quit if close window
  16138.  beq .done
  16139.  cmp.b #$97,d0             ;quit if inactive window
  16140.  beq .done
  16141.  cmp.b #$98,d0             ;go if slider
  16142.  beq .scoz
  16143.  bra .lokc                 ;reject other inputs
  16144.  
  16145. ; Multiline - ctrl key clicked when locked
  16146.  
  16147. .lkct:                     ;ctrl if clicked
  16148.  cmp.b #1,d0
  16149.  beq .frst                 ;ctrl a - first line
  16150.  cmp.b #26,d0
  16151.  beq .last                 ;ctrl z - last line
  16152.  bra .lokt                 ;reject other inputs
  16153.  
  16154. ; Multline - select font
  16155.  
  16156. .font:
  16157.  moveq #0,d0               ;select a font
  16158.  bsr TLReqfont
  16159.  subq.w #1,d0
  16160.  bmi.s .foqt               ;go if none selected
  16161.  moveq #0,d1
  16162.  moveq #0,d2
  16163.  bsr TLNewfont             ;attach selected font
  16164.  beq.s .foqt               ;go if can't
  16165.  move.l xxp_FSuite(a4),a0
  16166.  move.w xxp_Fnum(a5),d0
  16167.  mulu #xxp_fsiz,d0
  16168.  move.w ta_YSize(a0,d0.w),.fonh(a6) ;set font height
  16169. .foqt:
  16170.  jsr TLError               ;if error, report to output stream
  16171.  bra .kapt
  16172.  
  16173. ************** Multiline Soubroutines *************
  16174.  
  16175. ; Multiline Subroutine - validate memory contents
  16176.  
  16177. .vald:                     ;* validates all from .mmem to .mtop
  16178.  move.l #-1,.rngs(a6)      ;annul range
  16179.  move.l #-1,.rnge(a6)
  16180.  moveq #0,d7               ;d7 = count of bad chrs removed
  16181.  moveq #0,d6               ;d6 = longest line encountered
  16182.  moveq #0,d5               ;d5 = number of lines encountered
  16183.  moveq #0,d3               ;d3 = number of lines truncated
  16184.  move.l .mtop(a6),a3       ;a3 = memtop
  16185.  move.l .mmem(a6),a0       ;a0 gets
  16186.  move.l a0,a1              ;a1 puts
  16187. .line:                     ;* validate next line
  16188.  move.l a1,a2              ;remember address of line start
  16189. .char:                     ;* validate next chr
  16190.  move.b (a0)+,d0
  16191.  cmp.b #9,d0
  16192.  bne.s .chrc               ;go if not tab chr
  16193.  move.b #32,(a1)+          ;put spaces
  16194.  bra .char
  16195. .chrc:
  16196.  move.b d0,(a1)+           ;tfr chr
  16197.  beq.s .eol                ;eol if $00
  16198.  cmp.b #$0A,d0
  16199.  beq.s .eol                ;eol if $0A
  16200.  cmp.b #32,d0
  16201.  bcs.s .badc               ;bad if <32
  16202.  cmp.b #127,d0
  16203.  bcs .char                 ;ok if 32 - 126
  16204.  cmp.b #160,d0
  16205.  bcc .char                 ;ok if 160 - 255
  16206. .badc:                     ;* bad chr found
  16207.  addq.l #1,d7              ;bump bad chr count
  16208.  subq.l #1,a1              ;remove bad chr
  16209.  bra .char
  16210. .eol:                      ;* eol found
  16211.  subq.l #1,a1
  16212.  tst.l d5
  16213.  beq.s .eol2               ;go if 1st line
  16214. .eol1:
  16215.  cmp.b #32,-(a1)           ;remove trailing spaces
  16216.  beq .eol1
  16217.  bra.s .llen               ;a1 points to last non-space, or end of prev line
  16218. .eol2:
  16219.  cmp.b #32,-(a1)
  16220.  bne.s .llen               ;remove trailing spaces from 1st line
  16221.  cmp.l a2,a1
  16222.  bcc .eol2
  16223. .llen:
  16224.  addq.l #1,a1              ;point to end of line
  16225.  move.l a1,d4
  16226.  sub.l a2,d4               ;d4 = line len
  16227.  cmp.l #255,d4
  16228.  bcs.s .shrt               ;go if line <255 chrs
  16229.  move.l a2,a1              ;point a1 back to start of line
  16230.  move.l #254,d4            ;d4 = line len, as truncated
  16231.  add.l d4,a1               ;add back 254, to make it 254 chrs
  16232.  addq.l #1,d3              ;bump truncation counter
  16233. .shrt:
  16234.  clr.b (a1)+               ;null delimit line
  16235.  cmp.l d4,d6
  16236.  bcc.s .max                ;put line len in d6 if d4 > existing d6
  16237.  move.l d4,d6
  16238. .max:
  16239.  addq.l #1,d5              ;bump line count
  16240.  cmp.l .mtop(a6),a0        ;have we reached the end of lines?
  16241.  bcs .line                 ;no, to next line
  16242.  move.l d5,.lins(a6)       ;set .lins = number of lines
  16243.  move.l a1,.mtop(a6)       ;set .mtop = where output reached
  16244.  cmp.l .curr(a6),d5
  16245.  bhi.s .max1
  16246.  move.l d5,.curr(a6)       ;make sure .curr < number of lines
  16247.  subq.l #1,.curr(a6)
  16248. .max1:
  16249.  moveq #31,d0
  16250.  move.l d7,d1
  16251.  
  16252.  beq.s .rep1               ;go if no bad chrs found
  16253.  ori.b #3,.chnd+3(a6)
  16254.  bsr .rp10                 ;else, report no. of bad chrs found
  16255. .rep1:
  16256.  
  16257.  moveq #32,d0              ;go if no lines truncated
  16258.  move.l d3,d1
  16259.  beq.s .rep2
  16260.  ori.b #3,.chnd+3(a6)
  16261.  bsr .rp10                 ;else, report no. of lines truncated as >254 chrs
  16262. .rep2:
  16263.  
  16264.  cmp.w .mmxc(a6),d6        ;go if longest line > .mmxc
  16265.  bhi .tool
  16266.  beq .toos                 ;go if d6 = mmxc
  16267.  tst.w .valc(a6)           ;go if not calling line length unless must
  16268.  bmi .toos
  16269.  cmp.w #5,d6               ;go if longest line < 5
  16270.  bcs .toos
  16271.  cmp.w #76,.mmxc(a6)       ;always accept if longest allowed = 76
  16272.  beq .toos
  16273.  
  16274.  sub.w #200,a7             ;report ok - get longest allowed if required
  16275.  lea .s216,a0
  16276.  move.l a7,a1
  16277.  clr.b (a1)+
  16278.  move.w #190,d0            ;tfr strings 216-9 to stack
  16279. .tos0:
  16280.  move.b (a0)+,(a1)+
  16281.  dbra d0,.tos0
  16282.  move.l a7,a0              ;put d6 = longest loaded
  16283.  add.w #33,a0
  16284.  move.b #' ',1(a0)
  16285.  move.b #' ',2(a0)
  16286.  moveq #0,d0
  16287.  move.w d6,d0
  16288.  jsr TLHexasc
  16289.  move.l a7,a0              ;put current longest allowed
  16290.  add.w #54,a0
  16291.  move.b #' ',1(a0)
  16292.  move.b #' ',2(a0)
  16293.  moveq #0,d0
  16294.  move.w .mmxc(a6),d0
  16295.  jsr TLHexasc
  16296.  moveq #1,d0               ;get ready to call Reqchoose
  16297.  moveq #2,d1
  16298.  cmp.w #76,d6
  16299.  bcc.s .tos1
  16300.  moveq #3,d1               ;if longest < 76, add string 219
  16301. .tos1:
  16302.  move.l xxp_strg(a4),196(a7)
  16303.  move.l a7,xxp_strg(a4)    ;point strg to stack
  16304.  bsr TLReqchoose           ;choose longest allowed option
  16305.  move.l 196(a7),xxp_strg(a4)
  16306.  add.w #200,a7
  16307.  cmp.w #2,d0
  16308.  bcs.s .toos               ;go if as is chosen
  16309.  bne.s .to76               ;go if 76 chosen
  16310. .tolo:
  16311.  cmp.w #20,d6              ;longest (=76) chosen
  16312.  bcc.s .to20
  16313.  moveq #20,d6              ;make sure at least 20
  16314. .to20:
  16315.  move.w d6,.mmxc(a6)       ;put longest loaded -> longest allowed
  16316.  bra .toos
  16317. .to76:
  16318.  move.w #76,.mmxc(a6)      ;put 76 -> longest allowed
  16319. .toos:
  16320.  rts                       ;else, return ok
  16321.  
  16322. .rp10:                     ;** report str D0, w. value in D1 at tab 10
  16323.  jsr TLStrbuf
  16324.  move.l d1,d0
  16325.  move.l a4,a0
  16326.  add.w #10,a0
  16327.  jsr TLHexasc
  16328.  moveq #0,d1
  16329.  bsr TLReqchoose
  16330.  rts
  16331.  
  16332. .tool:                     ;here if loo-long lines found
  16333.  sub.w #200,a7             ;put strings 88-90 in stack
  16334.  lea .st88,a0
  16335.  move.l a7,a1
  16336.  move.l a1,xxp_strg(a4)    ;point xxp_strg there
  16337.  clr.b (a1)+
  16338.  moveq #2,d0
  16339. .totf:
  16340.  move.b (a0)+,(a1)+
  16341.  bne .totf
  16342.  dbra d0,.totf
  16343.  move.l d6,d0              ;insert max string length
  16344.  move.l a7,a0
  16345.  add.w #14,a0
  16346.  jsr TLHexasc
  16347.  moveq #1,d0               ;choose new max / divide too-long lines
  16348.  moveq #2,d1
  16349.  move.l xxp_Help(a4),-(a7)
  16350.  clr.l xxp_Help(a4)
  16351.  bsr TLReqchoose
  16352.  move.l (a7)+,xxp_Help(a4)
  16353.  add.w #200,a7
  16354.  move.l #.str,xxp_strg(a4)
  16355.  cmp.w #1,d0
  16356.  bgt.s .towr               ;go if divide too-long lines
  16357.  move.w d6,.mmxc(a6)       ;else, set new .mmxc
  16358.  rts
  16359. .towr:                     ;* divide any too-long lines
  16360.  ori.b #3,.chnd+3(a6)
  16361.  moveq #0,d7               ;d7 counts chopped lines
  16362.  moveq #0,d1
  16363.  move.w .mmxc(a6),d1       ;d1 = required mmxc
  16364.  move.l .mmem(a6),a0       ;a0 scans
  16365.  move.l .mtop(a6),a2       ;a2 = mtop
  16366. .toln:                     ;next line...
  16367.  move.l a0,a1              ;a1 = start of line
  16368. .toch:
  16369.  tst.b (a0)+               ;find eol
  16370.  bne .toch
  16371.  move.l a0,d0              ;check its len
  16372.  sub.l a1,d0
  16373.  cmp.w d1,d0
  16374.  ble .took                 ;go if len ok
  16375.  move.l a1,a0              ;start too-long line again
  16376.  moveq #0,d2               ;d0 holds last space before too long
  16377.  add.l d1,a1               ;a1 = allowable limit of line
  16378. .tofw:
  16379.  cmp.b #32,(a0)+           ;find any spaces
  16380.  bne.s .tons
  16381.  move.l a0,d0              ;which put in d0 (d0 points to chr after spc)
  16382. .tons:
  16383.  cmp.l a1,a0               ;keep looking until allowable limit found
  16384.  bcs .tofw
  16385.  tst.l d0                  ;go if a space was found
  16386.  bne.s .togt
  16387.  move.l a0,d0              ;else overlay last chr
  16388. .togt:
  16389.  move.l d0,a0              ;restart after chop point
  16390.  clr.b -1(a0)              ;put eol before
  16391.  addq.l #1,.lins(a6)       ;bump no. of lines
  16392.  addq.l #1,d7              ;bump count of chopped lines
  16393. .took:
  16394.  cmp.l a2,a0               ;until last line reached
  16395.  bcs .toln
  16396.  moveq #33,d0              ;report no. of lines split
  16397.  move.l d7,d1
  16398.  bsr .rp10
  16399.  rts
  16400.  
  16401. ; Multiline subroutine - check topl, set slns
  16402. ;  1. if topl incompatible with curr, chooses a topl
  16403. ;  2. sets slns
  16404. ;  3. sets d2d5 to d2-d5 values for ScrollRaster
  16405.  
  16406. .tpck:
  16407.  movem.l d0-d7/a0-a3,-(a7) ;save all
  16408.  
  16409.  move.l xxp_Window(a5),a0  ;set .d2d5+0,4,8
  16410.  moveq #0,d0
  16411.  moveq #0,d1
  16412.  move.b wd_BorderRight(a0),d0
  16413.  sub.w d0,d1
  16414.  move.b wd_BorderLeft(a0),d0
  16415.  add.w wd_Width(a0),d1
  16416.  move.l d0,.d2d5(a6)       ;set .d2d5+0 = window lhs = border left
  16417.  subq.l #1,d1
  16418.  move.l d1,.d2d5+8(a6)     ;set .d2d5+8 = window rhs = wdth - rght - 1
  16419.  move.b wd_BorderTop(a0),d0
  16420.  move.l d0,.d2d5+4(a6)     ;set .d2d5+4 = window top = border top
  16421.  
  16422.  move.l .curr(a6),d0       ;do sanity check on topl
  16423.  tst.w .lock(a6)
  16424.  bne.s .tppt               ;if locked, topl always = curr
  16425.  
  16426.  sub.l .topl(a6),d0        ;go if curr > topl (as it should be)
  16427.  bcc.s .tprc
  16428.  
  16429.  move.l .curr(a6),d0       ;else if curr < 31, make provisional topl 0
  16430.  sub.l #30,d0
  16431.  bcs.s .tpp0
  16432.  add.l #25,d0              ;else, make topl = curr - 5
  16433.  bra.s .tppt
  16434. .tpp0:
  16435.  moveq #0,d0
  16436.  
  16437. .tppt:                     ;set topl with provisional value
  16438.  move.l d0,.topl(a6)
  16439.  
  16440. .tprc:
  16441.  moveq #0,d2
  16442.  move.w xxp_PHeight(a5),d2 ;set slns,d2d5+12
  16443.  divu .fonh(a6),d2
  16444.  and.l #$FFFF,d2           ;d2 = int(printable height / font height)
  16445.  move.l d2,d1
  16446.  move.w d2,.slns(a6)       ;set .slns = lines that will fit
  16447.  beq.s .tpbd               ;bad if no lines will fit
  16448.  
  16449.  mulu .fonh(a6),d2
  16450.  add.l .d2d5+4(a6),d2
  16451.  subq.l #1,d2
  16452.  move.l d2,.d2d5+12(a6)
  16453.  
  16454.  move.l .curr(a6),d0       ;topl - topl s/be < slns
  16455.  sub.l .topl(a6),d0
  16456.  cmp.l d1,d0
  16457.  bcs.s .tpgd               ;yes, go
  16458.  move.l .curr(a6),d0
  16459.  sub.l d1,d0               ;else, set topl to curr - slns + 1
  16460.  addq.l #1,d0
  16461.  bpl.s .tprb
  16462.  moveq #0,d0
  16463. .tprb:
  16464.  move.l d0,.topl(a6)
  16465.  
  16466. .tpgd:
  16467.  moveq #-1,d0              ;go quit good
  16468.  bra.s .tpqt
  16469.  
  16470. .tpbd:                     ;here if bad - no lines will fit
  16471.  moveq #0,d0
  16472.  
  16473. .tpqt:
  16474.  movem.l (a7)+,d0-d7/a0-a3 ;EQ if bad
  16475.  rts
  16476.  
  16477. ; Multiline subroutine - check range is valid, report if not
  16478.  
  16479. .vrng:
  16480.  move.l .rngs(a6),d0
  16481.  bmi.s .vrb1
  16482.  move.l .rnge(a6),d1
  16483.  bmi.s .vrb2
  16484.  cmp.l d0,d1
  16485.  bcs.s .vrb3
  16486.  moveq #-1,d2              ;MI if good
  16487.  rts
  16488. .vrb1:
  16489.  moveq #36,d0
  16490.  bra.s .vrbc
  16491. .vrb2:
  16492.  moveq #37,d0
  16493.  bra.s .vrbc
  16494. .vrb3:
  16495.  moveq #38,d0
  16496. .vrbc:
  16497.  moveq #1,d1               ;report error
  16498.  moveq #0,d2
  16499.  move.l xxp_Help(a4),-(a7)
  16500.  move.w #231,xxp_Help(a4)
  16501.  move.w #15,xxp_Help+2(a4)
  16502.  bsr TLReqinfo
  16503.  move.l (a7)+,xxp_Help(a4)
  16504.  moveq #0,d0               ;EQ if bad
  16505.  rts
  16506.  
  16507. ; Multiline subroutine - ready text for exit
  16508.  
  16509. .exit:
  16510.  move.l .mmem(a6),a0      ;a0 scans
  16511.  move.l .mtop(a6),a1      ;a1 is top of mem
  16512. .extc:
  16513.  tst.b (a0)+              ;find each eol
  16514.  bne .extc
  16515.  move.b #$0A,-1(a0)       ;which replace by $0A
  16516.  cmp.l a1,a0
  16517.  bcs .extc
  16518.  rts
  16519.  
  16520. ; Multiline subroutine - fix text after saving (reverse effect of .exit)
  16521.  
  16522. .ntry:
  16523.  move.l .mmem(a6),a0      ;a0 scans
  16524.  move.l .mtop(a6),a1      ;a1 is top of mem
  16525.  moveq #$0A,d0
  16526. .entc:
  16527.  cmp.b (a0)+,d0           ;find each eof
  16528.  bne .entc
  16529.  clr.b -1(a0)             ;replace it by $00
  16530.  cmp.l a1,a0              ;until eof found
  16531.  bcs .entc
  16532.  rts
  16533.  
  16534. ; Multiline subroutine - open file for save as
  16535.  
  16536. .safl:
  16537.  move.l .ffil(a6),a0       ;call TLAslfile
  16538.  move.l .fdir(a6),a1
  16539.  moveq #34,d0
  16540.  moveq #-1,d1
  16541.  jsr TLAslfile
  16542.  beq.s .sfqt               ;go if cancel / out of chip ram
  16543.  
  16544.  jsr TLOpenwrite           ;call TLOpenwrite
  16545.  bne.s .sfgd
  16546.  jsr TLError
  16547.  moveq #82,d0
  16548.  bra.s .sfrp
  16549.  
  16550. .sfgd:                     ;MI, D0=-1 if good
  16551.  moveq #-1,d0
  16552.  rts
  16553.  
  16554. .sfqt:
  16555.  moveq #80,d0
  16556.  tst.l xxp_errn(a4)
  16557.  beq.s .sfrp
  16558.  moveq #81,d0
  16559.  
  16560. .sfrp:
  16561.  move #1,d1
  16562.  moveq #0,d2
  16563.  move.l d0,d3
  16564.  move.l xxp_Help(a4),-(a7)
  16565.  clr.l xxp_Help(a4)
  16566.  bsr TLReqinfo
  16567.  move.l (a7)+,xxp_Help(a4)
  16568.  move.l d3,d0
  16569.  jsr TLStrbuf
  16570.  jsr TLOutput
  16571.  
  16572.  moveq #0,d0
  16573.  rts                       ;EQ, D0=0 if bad
  16574.  
  16575. ; Multiline subroutine - open file for save
  16576.  
  16577. .svfl:
  16578.  move.l .fdir(a6),a0       ;tfr dir to buff
  16579.  move.l a4,a1
  16580. .sltf:
  16581.  move.b (a0)+,(a1)+
  16582.  bne .sltf
  16583.  move.l a4,d1              ;add fil to dir in buff
  16584.  move.l .ffil(a6),d2
  16585.  move.l a6,a2
  16586.  move.l xxp_dosb(a4),a6
  16587.  jsr _LVOAddPart(a6)
  16588.  move.l a2,a6
  16589.  tst.l d0                  ;go if AddPart fails
  16590.  beq.s .slqt
  16591.  jsr TLOpenwrite           ;EQ if bad
  16592.  bne.s .slqt
  16593.  jsr TLError
  16594.  moveq #-1,d0
  16595. .slqt:                     ;MI if ok
  16596.  rts
  16597.  
  16598. ; Multiline subroutine - open file for load
  16599.  
  16600. .ldfl:
  16601.  move.l .ffil(a6),a0       ;call TLAslfile
  16602.  move.l .fdir(a6),a1
  16603.  moveq #34,d0
  16604.  moveq #1,d1
  16605.  jsr TLAslfile
  16606.  beq.s .lfqt               ;go if cancel / out of chipram
  16607.  
  16608.  jsr TLOpenread            ;call TLOpenread
  16609.  bne.s .lfgd
  16610.  jsr TLError
  16611.  moveq #82,d0
  16612.  bra.s .lfrp
  16613.  
  16614. .lfgd:
  16615.  moveq #-1,d0              ;MI, D0=-1 if good
  16616.  rts
  16617.  
  16618. .lfqt:
  16619.  moveq #80,d0
  16620.  tst.l xxp_errn(a4)
  16621.  beq.s .lfrp
  16622.  moveq #81,d0
  16623.  
  16624. .lfrp:
  16625.  moveq #1,d1
  16626.  moveq #0,d2
  16627.  move.l d0,d3
  16628.  move.l xxp_Help(a4),-(a7)
  16629.  clr.l xxp_Help(a4)
  16630.  bsr TLReqinfo
  16631.  move.l (a7)+,xxp_Help(a4)
  16632.  move.l d3,d0
  16633.  jsr TLStrbuf
  16634.  jsr TLOutput
  16635.  
  16636.  moveq #0,d0
  16637.  rts                       ;EQ, D0=0 if bad
  16638.  
  16639. ; TLMultiline subroutine -
  16640. ;   updates window if resized
  16641. ;   validates topl
  16642. ;   sets d2d5,slns,tpla
  16643. ; returns bad if window too small for 1 line to fit
  16644.  
  16645. .slsr:
  16646.  bsr TLReqcls              ;clear window          EQ not resized
  16647.  bsr TLWupdate             ;update window         MI resized ok
  16648.                            ;                      GT bad: window < font ht
  16649.  
  16650.  bsr .tpck                 ;check topl, set d2d5,slns
  16651.  
  16652.  tst.l .topl(a6)           ;set tpla
  16653.  bne.s .slsc
  16654.  move.l .mmem(a6),a0       ;if topl = 0, tpla = mmem
  16655.  bra.s .slsw
  16656. .slsc:
  16657.  move.l .crra(a6),a0       ;seek tpla
  16658.  move.l .curr(a6),d1
  16659.  sub.l .topl(a6),d1        ;d1 = curr - topl
  16660. .slsf:
  16661.  tst.b -(a0)               ;find end of previous line
  16662.  bne .slsf
  16663.  dbra d1,.slsf             ;until at eol before topl
  16664.  addq.l #1,a0              ; to topl
  16665. .slsw:
  16666.  move.l a0,.tpla(a6)       ;set tpla
  16667.  
  16668. .slsq:
  16669.  moveq #-1,d0              ;MI if window resized
  16670.  rts
  16671.  
  16672. .slsb:
  16673.  moveq #0,d0               ;EQ if window height < font height
  16674.  rts
  16675.  
  16676. ; TLMultiline subroutine -
  16677. ;   check size, postioning  of .curr -> set .offs, set horz scroller info
  16678.  
  16679. .chek:
  16680.  tst.w .slir(a6)           ;go if no scrollers
  16681.  beq.s .chku
  16682.  
  16683.  tst.w .lock(a6)           ;if locked, update horz scroller data
  16684.  beq.s .chku
  16685.  move.l xxp_scrl(a5),a0
  16686.  move.w .offs(a6),xxp_hztp+2(a0)      ;if locked, tt = 2048, vs = PWidth
  16687.  move.w xxp_PWidth(a5),xxp_hzvs+2(a0) ;           tp = offset
  16688.  
  16689. .chku:
  16690.  tst.w .lock(a6)           ;leave .offs alone if locked
  16691.  bne.s .chgd
  16692.  clr.l xxp_errn(a4)
  16693.  
  16694.  sub.w #28,a7              ;* get line width & crsr posn
  16695.  move.l a7,a0
  16696.  move.l #xxp_xcrsr,(a0)+   ;tag 1: cursor
  16697.  clr.w (a0)+
  16698.  move.w .crsr(a6),(a0)+
  16699.  move.l #xxp_xnprt,(a0)+   ;tag 2: don't print
  16700.  move.l #-1,(a0)+
  16701.  move.l #xxp_xtext,(a0)+   ;tag 3: point to text
  16702.  move.l .crra(a6),(a0)+
  16703.  clr.l (a0)                ;delimit tags
  16704.  move.l a7,a0
  16705.  moveq #0,d0
  16706.  moveq #0,d1
  16707.  jsr TLReqedit             ;get string length & crsr posn
  16708.  add.w #28,a7
  16709.  beq.s .chbd               ;go if bad (unlikely)
  16710.  
  16711.  moveq #-80,d0
  16712. .chtr:
  16713.  add.l #80,d0              ;try every 80 for offset
  16714.  cmp.w xxp_chnd(a4),d0
  16715.  bgt.s .chna               ;if offs > lhs of crsr, put offset at lhs of crsr
  16716.  move.w d0,.offs(a6)
  16717.  add.w xxp_PWidth(a5),d0
  16718.  cmp.w xxp_chnd+2(a4),d0   ;if crsr fits, use that
  16719.  bcc.s .chgd
  16720.  sub.w xxp_PWidth(a5),d0   ;else, to next
  16721.  bra .chtr
  16722. .chna:                     ;here is crsr too near rhs of 80 bit segment
  16723.  move.w xxp_chnd(a4),.offs(a6)
  16724.  
  16725. .chgd:
  16726.  moveq #-1,d0              ;MI if good
  16727.  rts
  16728.  
  16729. .chbd:                     ;* set errn if TLReqedit returns bad
  16730.  add.w #24,d0
  16731.  move.w d0,xxp_errn+2(a4)
  16732.  moveq #0,d0               ;EQ if bad (xxp_errn already set)
  16733.  rts
  16734.  
  16735. ; Multiline subroutine - draw all lines on window
  16736.  
  16737. .draw:
  16738.  clr.l xxp_errn(a4)
  16739.  moveq #0,d7               ;d7 = relative linum
  16740.  move.l .topl(a6),d6       ;d6 = absolute linum
  16741.  
  16742.  clr.w .ypos(a6)
  16743.  
  16744.  move.l .tpla(a6),a3       ;a3 = line address
  16745.  
  16746. .dwnx:
  16747.  tst.w .lock(a6)
  16748.  bne.s .dwdo               ;if unlocked...
  16749.  cmp.l .crra(a6),a3        ;...skip if line with cursor
  16750.  beq.s .dwfw
  16751. .dwdo:
  16752.  
  16753.  sub.w #28,a7              ;room for tags
  16754.  move.l a7,a0
  16755.  move.l #xxp_xoffs,(a0)+   ;tag 1: fixed offset
  16756.  clr.w (a0)+
  16757.  move.w .offs(a6),(a0)+
  16758.  move.l #xxp_xtext,(a0)+   ;tag 2: text address
  16759.  move.l a3,(a0)+
  16760.  move.l #xxp_xcrsr,(a0)+   ;tag 3: crsr = -1 (i.e. none)
  16761.  move.l #-1,(a0)+
  16762.  clr.l (a0)
  16763.  moveq #0,d0               ;d0 = xpos
  16764.  moveq #0,d1               ;d1 = ypos
  16765.  move.w .ypos(a6),d1
  16766.  move.l a7,a0              ;a0 = tags
  16767.  jsr TLReqedit             ;show line
  16768.  add.w #28,a7
  16769.  beq.s .dwbd               ;go if bad (unlikely)
  16770.  
  16771.  cmp.w #12,d0              ;go if window resized
  16772.  beq.s .dwrs
  16773.  
  16774. .dwfw:
  16775.  tst.b (a3)+               ;bypass line delimiter
  16776.  bne .dwfw
  16777.  
  16778.  move.w .fonh(a6),d0       ;bump .ypos
  16779.  add.w d0,.ypos(a6)
  16780.  
  16781.  addq.l #1,d6              ;bump abs linum
  16782.  cmp.l .lins(a6),d6
  16783.  bcc.s .dwgd               ;go if no more lines
  16784.  addq.w #1,d7              ;bump rel linum
  16785.  cmp.w .slns(a6),d7
  16786.  bcs .dwnx                 ;until all lines in window done
  16787.  
  16788. .dwgd:
  16789.  moveq #-1,d0              ;MI = good
  16790.  rts
  16791.  
  16792. .dwrs:
  16793.  moveq #1,d0               ;GT = window resized
  16794.  rts
  16795.  
  16796. .dwbd:
  16797.  add.w #24,d0
  16798.  move.w d0,xxp_errn+2(a4)
  16799.  moveq #0,d0               ;EQ = bad   (unlikely)(errn already set)
  16800.  rts
  16801.  
  16802. ; Multiline subroutine - edit current line
  16803.  
  16804. .edit:
  16805.  move.w #47,xxp_Help(a4)   ;set help
  16806.  move.w #20,xxp_Help+2(a4)
  16807.  
  16808.  move.l .crra(a6),a0       ;* put current line in FWork
  16809.  move.l xxp_FWork(a4),a1
  16810. .edtf:
  16811.  move.b (a0)+,(a1)+
  16812.  bne .edtf
  16813.  
  16814.  sub.w #92,a7              ;* room for 11 tags for TLReqedit
  16815.  move.l a7,a0
  16816.  move.l #xxp_xmaxc,(a0)+   ;tag 1: max chrs
  16817.  clr.w (a0)+
  16818.  move.w .mmxc(a6),(a0)+
  16819.  move.l #xxp_xtext,(a0)+   ;tag 2: text address
  16820.  move.l xxp_FWork(a4),(a0)+
  16821.  move.l #xxp_xcrsr,(a0)+   ;tag 3: cursor
  16822.  clr.w (a0)+
  16823.  move.w .crsr(a6),(a0)+
  16824.  move.l #xxp_xoffs,(a0)+   ;tag 4: forced offset
  16825.  clr.w (a0)+
  16826.  move.w .offs(a6),(a0)+
  16827.  move.l #xxp_xforb,(a0)+   ;tag 5: forbids  (force plaintext)
  16828.  move.l .forb(a6),(a0)+
  16829.  move.l #xxp_xtask,(a0)+   ;tag 6: task  (text w. contin line)
  16830.  move.l #xxp_xtcon,(a0)+
  16831.  move.l #xxp_xiclr,(a0)+   ;tag 8: clear tablet first
  16832.  move.l #-1,(a0)+
  16833.  move.l #xxp_xtral,(a0)+   ;tag 9: clear trailing spaces before return
  16834.  move.l #-1,(a0)+
  16835.  move.l #xxp_xkybd,(a0)+   ;tag 10: crsr pixel xpos in line clicked
  16836.  clr.w (a0)+
  16837.  move.w .kybd(a6),(a0)+    ;(annul .kybd after used)
  16838.  clr.w .kybd(a6)
  16839.  move.l #xxp_xmenu,(a0)+   ;tag 11: send Line Format menu strip
  16840.  move.l #4,(a0)+
  16841.  clr.l (a0)                ;delimit tags
  16842.  
  16843.  moveq #0,d0               ;d0 = xpos
  16844.  move.l .curr(a6),d1       ;d1 = ypos
  16845.  sub.l .topl(a6),d1
  16846.  mulu .fonh(a6),d1
  16847.  move.l a7,a0              ;a0 = tags
  16848.  
  16849.  jsr TLReqedit             ;* edit the line (.edit keeps return code)
  16850.  tst.w xxp_Help(a4)
  16851.  bpl.s .fhlp               ;go if help uncalled
  16852.  bclr #7,xxp_Help+2(a4)    ;mark help as uncalled
  16853. .fhlp:
  16854.  add.w #92,a7              ;discard tags
  16855.  
  16856.  movem.l d0/a6,-(a7)       ;restore background pen for scrolls
  16857.  move.l xxp_gfxb(a4),a6
  16858.  move.l xxp_WPort(a5),a1
  16859.  moveq #0,d0
  16860.  jsr _LVOSetBPen(a6)
  16861.  movem.l (a7)+,d0/a6
  16862.  
  16863.  move.w xxp_crsr+2(a4),.crsr(a6) ;update cursor
  16864.  tst.b xxp_chnd(a4)
  16865.  bpl .edgd                 ;go if text unchanged
  16866.  ori.b #3,.chnd+3(a6)      ;else, note text changed
  16867.  
  16868.  move.l xxp_FWork(a4),a0   ;* tfr newline to oldline (as far as will fit)
  16869.  move.l .crra(a6),a1       ;a0 gets, a1 puts
  16870.  moveq #0,d7               ;d7=0 if tfr'ing newline, -1 if tfr'ing contin
  16871. .edp0:
  16872.  tst.b (a1)                ;go if oldline finished
  16873.  beq.s .edp4
  16874.  tst.b (a0)                ;go if newline/contin finished
  16875.  beq.s .edp1
  16876.  move.b (a0)+,(a1)+        ;tfr next chr
  16877.  bra .edp0
  16878.  
  16879. .edp1:                     ;* newline/contin finished
  16880.  move.l a1,a0              ;(a1 to a0 ready for .edp2 in case we go there)
  16881.  tst.w d7
  16882.  bmi.s .edp2               ;go to .edp2 if we have just trf'ed contin line
  16883.  tst.b xxp_chnd+2(a4)
  16884.  bpl.s .edp2               ;go if .edp2 if no contin line
  16885.  clr.b (a1)+               ;send delimiter of newline
  16886.  moveq #-1,d7              ;flag we are getting contin line
  16887.  addq.l #1,.lins(a6)       ;bump no. of lines
  16888.  move.l xxp_FWork(a4),a0   ;point to contin line
  16889.  add.w #512,a0
  16890.  bra .edp0                 ;& resume trf'ing
  16891.  
  16892. .edp2:                     ;* newline/contin all tfr'ed, oldline eol not yet
  16893.  tst.b (a0)+               ;find end of oldline in a0
  16894.  bne .edp2
  16895.  subq.l #1,a0              ;a1,a0 point to delimiter of newline,oldline
  16896.  move.l .mtop(a6),a2       ;point a2 to old memtop
  16897. .edp3:
  16898.  move.b (a0)+,(a1)+        ;remove the gap between newline, oldline
  16899.  cmp.l a2,a0               ;until old memtop reached
  16900.  bcs .edp3
  16901.  move.l a1,.mtop(a6)       ;note new memtop
  16902.  bra.s .edgd               ;go - (newline/contin < oldline) now saved
  16903.  
  16904. .edp4:                     ;* eol of oldline reached
  16905.  move.l a4,a2              ;(a4 to a2 in case we go to .edp5)
  16906.  tst.b (a0)
  16907.  bne.s .edp5               ;to .edp5 if newline/contin eof not reached too
  16908.  tst.w d7                  ;if we just finished contin...
  16909.  bmi.s .edgd               ;go - (newline/contin = oldline) now saved
  16910.  tst.b xxp_chnd+2(a4)      ;if there is no contin...
  16911.  bpl.s .edgd               ;go - (newline/contin = oldline) now saved
  16912.  
  16913. .edp5:                     ;* here if newline/contin > oldline ....
  16914.  move.b (a0)+,(a2)+        ;put rest of newline/contin in buff
  16915.  bne .edp5
  16916.  tst.w d7                  ;go if we just tfr'ed contin
  16917.  bmi.s .edp7
  16918.  tst.b xxp_chnd+2(a4)      ;go if there is no contin
  16919.  bpl.s .edp7
  16920. .edp6:
  16921.  moveq #-1,d7              ;note we are tfr'ing contin
  16922.  addq.l #1,.lins(a6)       ;bump no. of lines
  16923.  move.l xxp_FWork(a4),a0
  16924.  add.w #512,a0             ;point a0 to contin line
  16925.  bra .edp5                 ;& resume tfr'ing to buff
  16926.  
  16927. .edp7:                     ;* a1 = delim of oldline
  16928.  subq.l #1,a2              ;* a2 = delim of newline/contin segment in buff
  16929.  move.l a2,d1              ;remember a2
  16930.  move.l .mtop(a6),a2       ;a2 = old memtop
  16931.  move.l a2,a3              ;a3 = new memtop = a2 + (d1 - a4)
  16932.  add.l d1,a3
  16933.  sub.l a4,a3
  16934.  cmp.l .fdir(a6),a3        ;is there enough memory?
  16935.  bhi .edom                 ;no, go -> out of memory
  16936.  move.l a3,.mtop(a6)       ;note new memtop
  16937. .edp8:
  16938.  move.b -(a2),-(a3)        ;create a hole down to a1 (incl delim of oldline)
  16939.  cmp.l a1,a2
  16940.  bhi .edp8
  16941.  move.l a4,a0              ;put from a4 (=buff)
  16942. .edp9:
  16943.  move.b (a0)+,(a1)+        ;tfr next byte
  16944.  cmp.l a3,a1               ;until new posn of oldline delim
  16945.  bcs .edp9
  16946.  
  16947. .edgd:
  16948.  moveq #-1,d1              ;* MI = good (return code still in D0)
  16949.  rts
  16950.  
  16951. .edom:                     ;* out of memory
  16952.  moveq #35,d0
  16953.  moveq #1,d1               ;report out of mem
  16954.  moveq #1,d2
  16955.  move.w #251,xxp_Help(a4)
  16956.  move.w #5,xxp_Help+2(a4)
  16957.  bsr TLReqinfo
  16958.  moveq #10,d0              ;& send return code as if bad fixed offset
  16959.  rts
  16960.  
  16961. ; Multiline subroutine - process contin line returned by .edit
  16962.  
  16963. .conu:
  16964.  move.l d0,d7              ;* save .edit's return code in d7
  16965.  tst.b xxp_chnd+2(a4)
  16966.  bpl .codq                 ;* go if no contin
  16967.  
  16968.  move.l .rngs(a6),d0       ;* adjust range if required
  16969.  bmi.s .cor1
  16970.  cmp.l .curr(a6),d0
  16971.  bls.s .cor1
  16972.  addq.l #1,.rngs(a6)       ;bump start if > old curr
  16973. .cor1:
  16974.  move.l .rnge(a6),d0
  16975.  bmi.s .cor2
  16976.  cmp.l .curr(a6),d0
  16977.  blt.s .cor2
  16978.  addq.l #1,.rnge(a6)       ;bump end if >= old curr
  16979. .cor2:
  16980.  
  16981.  btst #6,xxp_chnd+2(a4)    ;* bump curr,crra
  16982.  beq.s .cosm               ;go if crsr on oldline
  16983.  addq.l #1,.curr(a6)
  16984.  move.l .crra(a6),a0       ;else, bump curr & crra
  16985. .cor3:
  16986.  tst.b (a0)+
  16987.  bne .cor3
  16988.  move.l a0,.crra(a6)
  16989.  
  16990. .cosm:                     ;* scroll down conu -> botline (if any)
  16991.  moveq #0,d5               ;d5 = line height
  16992.  move.w .fonh(a6),d5
  16993.  move.l .curr(a6),d3       ;d3 = conu line rel to topl
  16994.  sub.l .topl(a6),d3        ;( = curr - topl)
  16995.  btst #6,xxp_chnd+2(a4)
  16996.  bne.s .cosw
  16997.  addq.l #1,d3              ;(or, curr+1 - topl if crsr not on conu)
  16998. .cosw:
  16999.  cmp.w .slns(a6),d3        ;go if nothing to be scrolled down
  17000.  bcc .cocu
  17001.  
  17002.  mulu d5,d3                ;d3 = ypos of conu, rel to topl
  17003.  move.l d5,d1
  17004.  neg.l d1                  ;d1 = amt to scroll
  17005.  add.l .d2d5+4(a6),d3      ;d3 = ypos of conu on window = ytop
  17006.  move.l .d2d5+12(a6),d5    ;d5 = ybot
  17007.  move.l .d2d5(a6),d2       ;d2 = xleft
  17008.  move.l .d2d5+8(a6),d4     ;d4 = xright
  17009.  
  17010.  moveq #0,d0
  17011.  move.l xxp_WPort(a5),a1
  17012.  jsr TLWCheck
  17013.  bne.s .codq               ;(don't scroll if window resized)
  17014.  move.l a6,a2
  17015.  move.l xxp_gfxb(a4),a6
  17016.  jsr _LVOScrollRaster(a6)
  17017.  move.l a2,a6
  17018.  
  17019.  btst #6,xxp_chnd+2(a4)    ;done ok if crsr on conu
  17020.  bne.s .codq               ;(no need to echo conu, .edit will echo it)
  17021.  
  17022.  move.l .crra(a6),a1       ;* echo conu, if crsr on conu-1...
  17023. .cor9:
  17024.  tst.b (a1)+               ;find its text address
  17025.  bne .cor9
  17026.  
  17027.  sub.w #28,a7
  17028.  move.l a7,a0
  17029.  move.l #xxp_xoffs,(a0)+   ;tag 1: fixed offset
  17030.  clr.w (a0)+
  17031.  move.w .offs(a6),(a0)+
  17032.  move.l #xxp_xtext,(a0)+   ;tag 2: point to text
  17033.  move.l a1,(a0)+
  17034.  move.l #xxp_xcrsr,(a0)+   ;tag 3: no cursor
  17035.  move.l #-1,(a0)+
  17036.  clr.l (a0)                ;delimit tags
  17037.  moveq #0,d0               ;xpos = 0
  17038.  move.l d3,d1
  17039.  sub.l .d2d5+4(a6),d1      ;d1 = ypos of conu
  17040.  move.l a7,a0
  17041.  jsr TLReqedit             ;echo contin
  17042.  add.w #28,a7
  17043.  bra.s .codq               ;done ok
  17044.  
  17045. .cocu:                     ;* conu is off bot of window
  17046.  btst #6,xxp_chnd+2(a4)
  17047.  beq.s .codq               ;quit if crsr not on conu
  17048.  
  17049.  bsr.s .cotr               ;scroll up until curr on window
  17050.  
  17051. .codq:                     ;* restore d0 = return code from edit
  17052.  move.l d7,d0
  17053.  rts
  17054.  
  17055. ; Multiline subroutine - scroll window up until curr is on window
  17056.  
  17057. .cotr:                     ;* bump topl & scroll up until conu fits
  17058.  addq.l #1,.topl(a6)
  17059.  move.l .tpla(a6),a0
  17060. .conx:
  17061.  tst.b (a0)+
  17062.  bne .conx
  17063.  move.l a0,.tpla(a6)
  17064.  
  17065.  moveq #0,d1               ;set d1 = lspace
  17066.  move.w .fonh(a6),d1
  17067.  
  17068.  move.l .d2d5(a6),d2       ;scroll up past old topl
  17069.  move.l .d2d5+4(a6),d3
  17070.  move.l .d2d5+8(a6),d4
  17071.  move.l .d2d5+12(a6),d5
  17072.  moveq #0,d0
  17073.  move.l xxp_WPort(a5),a1
  17074.  move.l a6,a2
  17075.  move.l xxp_gfxb(a4),a6
  17076.  move.l d1,d6
  17077.  jsr TLWCheck
  17078.  bne.s .corz
  17079.  jsr _LVOScrollRaster(a6)  ;don't scroll if window resized
  17080. .corz:
  17081.  move.l a2,a6
  17082.  rts
  17083.  
  17084. ; Multiline subroutine - show "about" info
  17085.  
  17086. .abot:
  17087.  tst.l xxp_about(a4)      ;go if caller has set about info
  17088.  bne.s .abus
  17089.  moveq #67,d0             ;attach default about info
  17090.  moveq #13,d1
  17091.  bra.s .abdo
  17092. .abus:
  17093.  move.l .glob(a6),xxp_strg(a4) ;temporarily attach global strings
  17094.  clr.l xxp_Help(a4)
  17095.  move.w xxp_about(a4),d0  ;attach user about info
  17096.  move.w xxp_about+2(a4),d1
  17097. .abdo:
  17098.  moveq #0,d2              ;display about
  17099.  move.l xxp_Help(a4),-(a7)
  17100.  clr.l xxp_Help(a4)
  17101.  bsr TLReqinfo
  17102.  move.l (a7)+,xxp_Help(a4)
  17103.  move.l #.str,xxp_strg(a4)
  17104.  rts
  17105.  
  17106. ; Multiline subroutine - see if memory buffer empty
  17107.  
  17108. .any:
  17109.  cmp.l #1,.lins(a6)
  17110.  bne.s .anyq
  17111.  move.l .mmem(a6),a0
  17112.  tst.b (a0)
  17113. .anyq:                    ;NE if anything
  17114.  rts                      ;EQ if nothing
  17115.  
  17116. ; Multiline subroutine - new the mmem
  17117.  
  17118. .new:
  17119.  movem.l d0/a0,-(a7)
  17120.  bclr #1,.chnd+3(a6)       ;mark as "saved"
  17121.  bset #0,.chnd+3(a6)       ;mark as changed
  17122.  move.l #-1,.rngs(a6)      ;zap everything
  17123.  move.l #-1,.rnge(a6)
  17124.  move.l #1,.lins(a6)
  17125.  clr.l .curr(a6)
  17126.  clr.l .topl(a0)
  17127.  move.l .mmem(a6),a0
  17128.  clr.b (a0)+
  17129.  move.l a0,.mtop(a6)
  17130.  clr.w .crsr(a6)
  17131.  movem.l (a7)+,d0/a0
  17132.  rts
  17133.  
  17134. ; Multiline subroutine - get a seek string
  17135.  
  17136. .sstr:
  17137.  move.w #92,xxp_Help(a4)  ;attach help
  17138.  move.w #15,xxp_Help+2(a4)
  17139.  clr.b (a4)
  17140.  move.w #135,d0
  17141.  moveq #0,d1
  17142.  moveq #30,d2
  17143.  moveq #0,d3
  17144.  bsr TLReqinput           ;get input
  17145.  beq .ssbd                ;go if cancel
  17146.  move.l a4,a0
  17147.  move.l a4,a1
  17148.  add.w #xxp_patt,a1       ;a0 gets, a1 puts
  17149.  tst.b (a0)
  17150.  beq.s .ssgd              ;keep xxp_patt if null input
  17151.  clr.b 31(a1)
  17152.  cmp.b #'|',(a0)
  17153.  bne.s .sscs
  17154.  move.b #$DF,31(a1)       ;xxp_patt+31 = 0 if sig, -1 if blind
  17155.  addq.l #1,a0
  17156. .sscs:
  17157.  move.b (a0)+,(a1)+       ;tfr input to xxp_patt
  17158.  bne .sscs
  17159. .ssgd:
  17160.  move.b xxp_patt(a4),d6   ;d6 = 1st chr, reject if null
  17161.  beq .sstr
  17162.  move.b xxp_patt+31(a4),d7 ;d7: EQ=significant, MI=blind
  17163.  moveq #-1,d0             ;MI = good
  17164.  rts
  17165. .ssbd:
  17166.  moveq #0,d0              ;EQ = bad (cancel)
  17167.  rts
  17168.  
  17169. ; Multline subroutine - signal seek unfound
  17170.  
  17171. .skbd:
  17172.  move.l a6,a2
  17173.  move.l xxp_intb(a4),a6
  17174.  move.l xxp_Screen(a4),a0
  17175.  jsr _LVODisplayBeep(a6)
  17176.  move.l a2,a6
  17177.  rts
  17178.  
  17179. ; Multliline subroutine - seek forward
  17180.  
  17181. .sfwd
  17182.  bsr .sstr                ;get string; d6 = 1st chr, d7 = $DF if caseblind
  17183.  beq.s .sfdn              ;go if cancel
  17184.  move.l a4,a3
  17185.  add.w #xxp_patt+1,a3     ;a3 points to 2nd chr, 1st chr in d6
  17186.  move.l .curr(a6),d4      ;d4 holds propoed curr
  17187.  move.l .lins(a6),d5      ;d5 = lins
  17188.  move.l .crra(a6),a2      ;a2 holds proposed crra
  17189.  bra.s .sfnx              ;try next line
  17190. .sffw:
  17191.  tst.b (a2)+              ;forward a line
  17192.  bne .sffw
  17193.  bsr.s .stst              ;seek string in it
  17194.  bne.s .sfnx              ;go if unfound
  17195.  move.l d4,.curr(a6)      ;found: set curr
  17196.  move.l a2,.crra(a6)      ;       set crra
  17197.  bra.s .sfdn
  17198. .sfnx:
  17199.  addq.l #1,d4             ;bump proposed curr
  17200.  cmp.l d5,d4
  17201.  bcs .sffw                ;continue until eof
  17202.  bsr .skbd                ;report string unfound
  17203. .sfdn:
  17204.  rts
  17205.  
  17206. ; Multiline subroutine -
  17207. ;   see if sought at (a3) in line (a2), case in d7 (EQ = sig), 1st chr in d6
  17208.  
  17209. .stst:
  17210.  move.l a2,d3              ;save a2 in d3
  17211.  tst.b d7
  17212.  bne.s .stz2               ;go if case blind
  17213. .stz0:
  17214.  tst.b (a2)
  17215.  beq.s .stzn               ;unfound if eol
  17216.  cmp.b (a2)+,d6            ;next chr of line matches 1st chr?
  17217.  bne .stz0                 ;no, keep looking
  17218.  move.l a2,a0              ;(a0) = chr after matched chr
  17219.  move.l a3,a1              ;(a1) = 2nd chr of sought
  17220. .stz1:
  17221.  tst.b (a1)                ;sought finished?
  17222.  beq.s .stzy               ;yes, string found
  17223.  cmpm.b (a0)+,(a1)+        ;no, match next chr
  17224.  beq .stz1                 ;continue if matched
  17225.  bra .stz0                 ;else, try next chr in line
  17226. .stz2:                     ;* here if case blind
  17227.  tst.b (a2)
  17228.  beq.s .stzn               ;unfound if eol
  17229.  move.b d6,d0
  17230.  move.b (a2)+,d1
  17231.  eor.b d1,d0               ;(all mismatched bits = 1)
  17232.  and.b d7,d0               ;(remove bit 5)
  17233.  tst.b d0                  ;all except bit 5 matched?
  17234.  bne .stz2                 ;no, keep looking
  17235.  move.l a2,a0              ;(a0) = chr after matched chr
  17236.  move.l a3,a1              ;(a1) = 2nd chr of sought
  17237. .stz3:
  17238.  tst.b (a1)                ;sought finished?
  17239.  beq.s .stzy               ;yes, string found
  17240.  move.b (a0)+,d0           ;else, match next chr
  17241.  move.b (a1)+,d1
  17242.  eor.b d1,d0
  17243.  and.b d7,d0
  17244.  beq .stz3                 ;continue if matched
  17245.  bra .stz2                 ;else, try next chr in line
  17246. .stzn:                     ;NE if string unfound
  17247.  move.l d3,a2
  17248.  moveq #-1,d0
  17249.  rts
  17250. .stzy:                     ;EQ if string found
  17251.  move.l a2,d0
  17252.  sub.l d3,d0
  17253.  subq.w #1,d0
  17254.  move.w d0,.crsr(a6)       ;set cursor
  17255.  move.l d3,a2              ;restore a2 = crra
  17256.  moveq #0,d0
  17257.  rts
  17258.  
  17259. ; Multiline subroutine - seek back
  17260.  
  17261. .sbak
  17262.  bsr .sstr                ;get sought; d6 = 1st chr, d7 = $DF if case blind
  17263.  beq.s .sbdn              ;go if cancel
  17264.  move.l a4,a3
  17265.  add.w #xxp_patt+1,a3     ;a3 points to 2nd chr, 1st chr in d6
  17266.  move.l .curr(a6),d4      ;d4 holds proposed curr
  17267.  beq .sbbd                ;go if at 1st line already
  17268.  move.l .crra(a6),a2      ;a2 holds proposed crra
  17269.  bra.s .sbnx              ;try next line
  17270. .sbbk:
  17271.  tst.b -(a2)              ;back a line
  17272.  bne .sbbk
  17273.  addq.l #1,a2
  17274.  bsr.s .stst              ;seek string in it
  17275.  bne.s .sbnx              ;go if unfound
  17276. .sbys:
  17277.  move.l d4,.curr(a6)      ;found: set curr
  17278.  move.l a2,.crra(a6)      ;       set crra
  17279.  bra.s .sbdn
  17280. .sbnx:
  17281.  subq.l #1,a2             ;ready to go back a line
  17282.  subq.l #1,d4             ;dec proposed curr
  17283.  bne .sbbk
  17284.  move.l .mmem(a6),a2      ;to mmem if at 1st line
  17285.  bsr .stst                ;seek string in it
  17286.  beq .sbys                ;go if found
  17287. .sbbd:
  17288.  bsr .skbd                ;report string unfound
  17289. .sbdn:
  17290.  rts
  17291.  
  17292. ; Multiline subroutine - seek left
  17293.  
  17294. .slef
  17295.  bsr .sstr                 ;get sought  d6 = 1st chr, d7 = $DF if case blind
  17296.  beq.s .sldn               ;go if cancel
  17297.  move.l a4,a3
  17298.  add.w #xxp_patt+1,a3      ;a3 points to 2nd chr of sought
  17299.  move.l .lins(a6),d5       ;d5 = lins
  17300.  moveq #0,d4               ;d4 holds proposed curr
  17301.  move.l .mmem(a6),a2       ;a2 holds proposed crra
  17302.  bra.s .sltr               ;go try 1st line
  17303. .slnx:
  17304.  tst.b (a2)+               ;to next line
  17305.  bne .slnx
  17306. .sltr:
  17307.  tst.b d7                  ;go if case blind
  17308.  bne.s .slbl
  17309.  cmp.b (a2),d6             ;first chr matched?
  17310.  bne.s .slfw               ;no, go
  17311.  move.l a3,a0              ;(a0) = 2nd chr sought
  17312.  move.l a2,a1              ;(a1) = 2nd chr of line
  17313.  addq.l #1,a1
  17314. .slcs:
  17315.  tst.b (a0)                ;end of sought reached?
  17316.  beq.s .slys               ;yes, string found
  17317.  cmpm.b (a0)+,(a1)+        ;else, match next chr
  17318.  beq .slcs
  17319.  bra.s .slfw               ;to next line if mismatch
  17320. .slbl:                     ;* here for case blind
  17321.  move.b (a2),d0            ;first chr matched?
  17322.  eor.b d6,d0
  17323.  and.b d7,d0
  17324.  tst.b d0
  17325.  bne.s .slfw
  17326.  move.l a3,a0              ;(a0) = 2nd chr sought
  17327.  move.l a2,a1              ;(a1) = 2nd chr of line
  17328.  addq.l #1,a1
  17329. .slbc:
  17330.  tst.b (a0)                ;end of sought reached?
  17331.  beq.s .slys               ;yes, string found
  17332.  move.b (a0)+,d0
  17333.  move.b (a1)+,d1           ;else, match next chr
  17334.  eor.b d1,d0
  17335.  and.b d7,d0
  17336.  tst.b d0
  17337.  beq .slbc                 ;to next chr unless mismatch
  17338. .slfw:                     ;* to next line
  17339.  addq.l #1,d4              ;bump proposed curr
  17340.  cmp.l d5,d4
  17341.  bcs .slnx                 ;until all lines looked at
  17342.  bsr .skbd                 ;report can't find string
  17343.  bra.s .sldn
  17344. .slys:                     ;string found...
  17345.  clr.w .crsr(a6)           ;set crsr
  17346.  move.l d4,.curr(a6)       ;set curr
  17347.  move.l a2,.crra(a6)       ;set crra
  17348. .sldn:
  17349.  rts
  17350.  
  17351. ; Multiline subroutine - show data about memory contents
  17352.  
  17353. .data:
  17354.  move.l xxp_Help(a4),-(a7)
  17355.  moveq #107,d0             ;put strings 107+ in xxp_gide point xxp_strg ther
  17356.  jsr TLStra0               ;(so that we can modify them and be re-entrant)
  17357.  move.w #9,xxp_Help(a4)
  17358.  move.w #14,xxp_Help+2(a4)
  17359.  
  17360.  move.l xxp_gide(a4),a1
  17361.  move.l a1,xxp_strg(a4)
  17362.  clr.b (a1)+
  17363.  moveq #21,d0
  17364. .dttf:
  17365.  move.b (a0)+,(a1)+
  17366.  bne .dttf
  17367.  dbra d0,.dttf
  17368.  move.l xxp_gide(a4),a0    ;poke number of lines
  17369.  add.w #50,a0
  17370.  move.l .lins(a6),d0
  17371.  jsr TLHexasc
  17372.  move.l .mmem(a6),a0
  17373.  moveq #0,d7               ;d7 counts line number
  17374.  moveq #0,d6               ;d6 holds max line length
  17375.  moveq #0,d5               ;d5 counts paragraphs
  17376.  moveq #0,d4               ;d4 <> if paragraph has begun (msw=font,lsw=just)
  17377.  moveq #0,d3               ;d3 counts words
  17378. .dtln:                     ;scan next line
  17379.  tst.b (a0)
  17380.  beq.s .dtep               ;can't be in para if null
  17381. .dtsm:
  17382.  cmp.b #32,(a0)            ;can't be in para if starts with space
  17383.  bne.s .dtlt
  17384. .dtep:
  17385.  moveq #0,d4               ;note not in para
  17386.  bra.s .dtwd
  17387. .dtlt:
  17388.  move.l d7,d0              ;get line font, just
  17389.  swap d0                   ;put data in d0 halves, negate
  17390.  move.w d1,d0
  17391.  bset #31,d0
  17392.  cmp.l d0,d4               ;para continues?
  17393.  beq.s .dtwd               ;yes, go
  17394.  addq.l #1,d5              ;no, start a para
  17395.  move.l d0,d4              ;& note its type code
  17396. .dtwd:                     ;* count words in line
  17397.  move.l a0,a1              ;a1 = line start
  17398. .dtfs:                     ;seek for a possible word...
  17399.  move.b (a0)+,d0
  17400.  beq.s .dtel               ;go if eol reached
  17401.  cmp.b #'A',d0
  17402.  bcs .dtfs                 ;must start with A-Z or a-z
  17403.  cmp.b #'Z'+1,d0
  17404.  bcs.s .dtmb
  17405.  cmp.b #'a',d0
  17406.  bcs .dtfs
  17407.  cmp.b #'z'+1,d0
  17408.  bcc .dtfs
  17409. .dtmb:                     ;A-Z of a-z found - see if a-z follows
  17410.  move.b (a0)+,d0
  17411.  beq.s .dtel               ;go if eol
  17412.  cmp.b #'a',d0
  17413.  bcs .dtfs                 ;else seek a possible word start
  17414.  cmp.b #'z'+1,d0
  17415.  bcc .dtfs
  17416. .dtbd:                     ;bypass rest of word
  17417.  move.b (a0)+,d0
  17418.  beq.s .dtwe               ;word & line ends if eol
  17419.  cmp.b #'''',d0
  17420.  beq .dtbd                 ;word continues if ' or a-z
  17421.  cmp.b #'a',d0
  17422.  bcs.s .dtwg
  17423.  cmp.b #'z'+1,d0
  17424.  bcs .dtbd
  17425. .dtwg:
  17426.  addq.l #1,d3              ;word ends: bump word count
  17427.  bra .dtfs                 ;& seek another
  17428. .dtwe:
  17429.  addq.l #1,d3              ;word ends & eol found: bump word count
  17430. .dtel:
  17431.  move.l a0,d0              ;eol reached: get line len to d0
  17432.  sub.l a1,d0
  17433.  subq.l #1,d0
  17434.  cmp.l d0,d6
  17435.  bcc.s .dtnl
  17436.  move.l d0,d6              ;put in d6 if > existing maxlen
  17437. .dtnl:
  17438.  addq.l #1,d7              ;bump line num
  17439.  cmp.l .lins(a6),d7        ;until all lines done
  17440.  bcs .dtln
  17441.  move.l xxp_gide(a4),a0    ;insert max line len
  17442.  add.w #85,a0
  17443.  move.l d6,d0
  17444.  jsr TLHexasc
  17445.  move.l xxp_gide(a4),a0    ;insert total words
  17446.  add.w #120,a0
  17447.  move.l d3,d0
  17448.  jsr TLHexasc
  17449.  move.l xxp_gide(a4),a0    ;insert total paras
  17450.  add.w #155,a0
  17451.  move.l d5,d0
  17452.  jsr TLHexasc
  17453.  move.l xxp_gide(a4),a0    ;insert line number
  17454.  add.w #190,a0
  17455.  move.l .curr(a6),d0
  17456.  addq.l #1,d0
  17457.  jsr TLHexasc
  17458.  move.l xxp_gide(a4),a0    ;insert memory used
  17459.  add.w #225,a0
  17460.  move.l .mtop(a6),d1
  17461.  sub.l .mmem(a6),d1
  17462.  add.l #164,d1
  17463.  move.l d1,d0
  17464.  jsr TLHexasc
  17465.  move.l xxp_gide(a4),a0    ;insert memory unused
  17466.  add.w #260,a0
  17467.  move.l xxp_Mmsz(a5),d0
  17468.  sub.l d1,d0
  17469.  jsr TLHexasc
  17470.  moveq #1,d0               ;report stats
  17471.  moveq #8,d1
  17472.  moveq #0,d2
  17473.  bsr TLReqinfo
  17474.  move.l #.str,xxp_strg(a4)
  17475.  
  17476.  move.l (a7)+,xxp_Help(a4)
  17477.  rts
  17478.  
  17479. ; Multiline subroutine - View Multiline.guide
  17480.  
  17481. .guid:
  17482.  move.l xxp_guid(a4),-(a7)
  17483.  move.l xxp_node(a4),-(a7)
  17484.  move.l #.s137,xxp_guid(a4)
  17485.  clr.l xxp_node(a4)
  17486.  bsr TLGuide
  17487.  move.l (a7)+,xxp_node(a4)
  17488.  move.l (a7)+,xxp_guid(a4)
  17489.  rts
  17490.  
  17491. ; Multiline subroutine - enable / disable menu items
  17492.  
  17493. .able:
  17494.  move.l .forb(a6),d7       ;TLReqedit forbids
  17495.  move.l .chnd(a6),d6       ;TLMultiline forbids
  17496.  move.w .lock(a6),d5
  17497.  moveq #0,d0               ;* menu 0
  17498.  moveq #-1,d2
  17499.  moveq #0,d1               ;load
  17500.  bsr .ab31
  17501.  moveq #1,d1               ;save
  17502.  btst #2,d6
  17503.  bsr .aboo
  17504.  moveq #3,d1               ;save as
  17505.  btst #2,d6
  17506.  bsr .aboo
  17507.  moveq #10,d1              ;lock/unlock
  17508.  tst.w .rlok(a6)
  17509.  bsr .aboo
  17510.  moveq #2,d0               ;* menu 2
  17511.  moveq #0,d1               ;iline
  17512.  bsr .ab31
  17513.  moveq #1,d1               ;dline
  17514.  bsr .ab31
  17515.  moveq #5,d1               ;irng
  17516.  bsr .ab31
  17517.  moveq #6,d1               ;drng
  17518.  bsr .ab31
  17519.  moveq #8,d1               ;srng
  17520.  btst #2,d6
  17521.  bsr .aboo
  17522.  moveq #9,d1               ;ifil
  17523.  bsr .ab31
  17524.  moveq #11,d1              ;rewrap
  17525.  bsr .ab31
  17526.  moveq #12,d1              ;llen
  17527.  bsr .ab31
  17528.  moveq #13,d1              ;spel
  17529.  bsr .ab31
  17530.  moveq #16,d1              ;new
  17531.  bsr .ab31
  17532.  moveq #3,d0               ;* menu 3
  17533.  moveq #0,d1               ;font
  17534.  btst #12,d6
  17535.  bsr .aboo
  17536.  moveq #1,d1               ;pturn
  17537.  btst #4,d6
  17538.  bsr .aboo
  17539.  moveq #2,d1               ;bturn
  17540.  btst #5,d6
  17541.  bsr .aboo
  17542.  moveq #3,d1               ;pg/bl shape
  17543.  btst #4,d6
  17544.  bsr .aboo
  17545.  moveq #4,d1               ;lspc
  17546.  btst #6,d6
  17547.  bsr .aboo
  17548.  moveq #5,d1               ;cspc
  17549.  btst #7,d6
  17550.  bsr .aboo
  17551.  moveq #6,d1               ;fjst limit
  17552.  btst #8,d6
  17553.  bsr .aboo
  17554.  moveq #7,d1               ;pens
  17555.  btst #9,d6
  17556.  bsr .aboo
  17557.  moveq #8,d1               ;graphics
  17558.  btst #11,d6
  17559.  bsr .aboo
  17560.  moveq #4,d0               ;* menu 4
  17561.  moveq #0,d1
  17562.  moveq #0,d2               ;bold
  17563.  btst #0,d7
  17564.  bsr .abor
  17565.  moveq #1,d2               ;ital
  17566.  btst #1,d7
  17567.  bsr .abor
  17568.  moveq #2,d2               ;wide
  17569.  btst #3,d7
  17570.  bsr .abor
  17571.  moveq #3,d2               ;shad
  17572.  btst #5,d7
  17573.  bsr .abor
  17574.  moveq #4,d2               ;super
  17575.  btst #11,d7
  17576.  bsr .abor
  17577.  moveq #5,d2               ;sub
  17578.  btst #11,d7
  17579.  bsr .abor
  17580.  moveq #1,d1
  17581.  moveq #0,d2               ;und0
  17582.  btst #2,d7
  17583.  bsr .abor
  17584.  moveq #1,d2               ;und1
  17585.  btst #2,d7
  17586.  bsr .abor
  17587.  moveq #2,d2               ;und2
  17588.  btst #2,d7
  17589.  bsr .abor
  17590.  moveq #3,d2               ;und3
  17591.  btst #2,d7
  17592.  bsr .abor
  17593.  moveq #4,d2               ;und4
  17594.  btst #2,d7
  17595.  bsr .abor
  17596.  moveq #5,d2               ;dot und
  17597.  btst #4,d7
  17598.  bsr .abor
  17599.  moveq #6,d2               ;strike thru
  17600.  btst #2,d7
  17601.  bsr .abor
  17602.  moveq #2,d1
  17603.  moveq #0,d2               ;rjst
  17604.  btst #6,d7
  17605.  bsr .abor
  17606.  moveq #1,d2               ;fjst
  17607.  btst #7,d7
  17608.  bsr .abor
  17609.  moveq #2,d2               ;cent
  17610.  btst #8,d7
  17611.  bsr .abor
  17612.  moveq #3,d2               ;ljst
  17613.  btst #9,d7
  17614.  bsr .abor
  17615.  moveq #3,d1               ;comp
  17616.  moveq #-1,d2
  17617.  btst #10,d7
  17618.  bsr .abor
  17619.  moveq #4,d1               ;erase
  17620.  bsr .ab31
  17621.  moveq #5,d1               ;undo
  17622.  bsr .ab31
  17623.  moveq #6,d1               ;restore
  17624.  bsr .ab31
  17625.  moveq #7,d1               ;spc fill
  17626.  bsr .ab31
  17627.  rts
  17628. .abor:                     ;** off if NE, else call .ab31
  17629.  bne.s .abof
  17630. .ab31:                     ;** off if locked else call .aboo
  17631.  tst.w d5
  17632.  bne.s .abof
  17633. .aboo:                     ;** item d0,d1,d2 on if EQ, off if NE
  17634.  bne.s .abof
  17635.  bsr TLOnmenu
  17636.  rts
  17637. .abof:
  17638.  bsr TLOffmenu
  17639.  rts
  17640.  
  17641. ; Multiline subroutine - update window's vertical slider
  17642.  
  17643. .vert:
  17644.  tst.w .slir(a6)          ;go if no scrollers
  17645.  beq.s .vrtq
  17646.  movem.l a0/d0-d1,-(a7)   ;saves all
  17647.  move.l xxp_scrl(a5),a0
  17648.  move.l .topl(a6),xxp_vttp(a0)   ;top = topline
  17649.  move.l .lins(a6),xxp_vttt(a0)   ;total = lines in mem
  17650.  moveq #0,d0
  17651.  move.w .slns(a6),d0      ;visible = least of slns,totl
  17652.  cmp.l .lins(a6),d0
  17653.  bcs.s .vrtc
  17654.  move.l .lins(a6),d0
  17655. .vrtc:
  17656.  move.l d0,xxp_vtvs(a0)
  17657.  moveq #0,d0
  17658.  moveq #-1,d1              ;update vert scroll
  17659.  tst.w .lock(a6)
  17660.  beq.s .vrtu
  17661.  moveq #0,d1               ;also update horz if locked
  17662. .vrtu:
  17663.  bsr TLWscroll
  17664.  movem.l (a7)+,a0/d0-d1
  17665. .vrtq:
  17666.  rts
  17667.  
  17668. ; Multiline subroutine - called from re-wrap
  17669. ;   remove trailing spaces from output lines before appending eol
  17670.  
  17671. .rwtl:
  17672.  cmp.l a3,a1               ;go if at start of line
  17673.  beq.s .rwtq
  17674.  cmp.b #32,-(a1)           ;last chr = spc?
  17675.  beq .rwtl                 ;yes, remove it
  17676.  addq.l #1,a1              ;no, keep it
  17677. .rwtq:
  17678.  rts
  17679.  
  17680. ; Multiline subroutine - interact ready to print a page  (lines d4-d5)
  17681. ;   on call, .pqal,.pqzz,.pqpg,.pqcl,.pqmg already set
  17682.  
  17683. .pqdo:
  17684.  move.l .mmem(a6),a0       ;initialise .pqla
  17685.  move.l .pqal(a6),d0
  17686.  bra.s .pqzf
  17687. .pqzp:
  17688.  tst.b (a0)+
  17689.  bne .pqzp
  17690. .pqzf:
  17691.  subq.l #1,d0
  17692.  bpl .pqzp
  17693.  move.l a0,.pqla(a6)
  17694.  
  17695. .pqnx:                     ;* do next page
  17696.  move.l .pqla(a6),a0
  17697.  move.l .pqal(a6),d0
  17698.  
  17699. .pqlm:
  17700.  cmp.l .pqzz(a6),d0        ;go if all lines printed
  17701.  bcc .pqqt
  17702.  
  17703. .pqbl:                     ;skip blank lines at start of page
  17704.  addq.l #1,d0
  17705.  tst.b (a0)+
  17706.  beq .pqlm
  17707.  subq.l #1,d0
  17708.  subq.l #1,a0
  17709.  move.l d0,.pqal(a6)
  17710.  move.l a0,.pqla(a6)
  17711.  
  17712.  moveq #0,d0               ;set .pqzl
  17713.  move.b .pqpg(a6),d0
  17714.  add.l .pqal(a6),d0
  17715.  subq.l #1,d0
  17716.  cmp.l .pqzz(a6),d0
  17717.  ble.s .pqep
  17718.  move.l .pqzz(a6),d0
  17719. .pqep:
  17720.  move.l d0,.pqzl(a6)
  17721.  
  17722.  move.l xxp_Height(a4),d2  ;select largest possible d2 to fit TLReqshow
  17723.  lsr.w #3,d2
  17724. .pqrf:
  17725.  lea .hook,a0
  17726.  move.l #279,d0
  17727.  move.l .pqzl(a6),d1
  17728.  sub.l .pqal(a6),d1
  17729.  add.w #12+1,d1
  17730.  cmp.w d2,d1
  17731.  bcc.s .pqcy
  17732.  move.w d2,d1
  17733. .pqcy:
  17734.  moveq #0,d3
  17735.  clr.w xxp_ReqNull(a4)
  17736.  bsr TLReqshow
  17737.  bne.s .pqry
  17738.  subq.w #1,d2              ;if d2=19 doesn't fit, dec d2 until it does
  17739.  bra .pqrf
  17740. .pqry:
  17741.  
  17742.  move.w #300,xxp_Help(a4)
  17743.  move.w #11,xxp_Help+2(a4)
  17744.  clr.l .pqkk(a6)           ;nothing clicked yet
  17745.  clr.b .pqts(a6)           ;print/skip/abandon not clicked
  17746.  move.l #279,d0            ;call TLReqshow
  17747.  bsr TLReqshow
  17748.  bne.s .pqpt               ;go print if Quit button
  17749.  tst.l xxp_errn(a4)
  17750.  bne .pqbd                 ;go if error
  17751.  
  17752. .pqpt:                     ;here if print/quit
  17753.  move.l .pqkk(a6),d0
  17754.  beq.s .pqbr               ;go if no line highlighted
  17755.  subq.w #1,d0
  17756.  add.l .pqal(a6),d0        ;else set pqzl to line before it
  17757.  move.l d0,.pqzl(a6)
  17758.  
  17759. .pqbr:
  17760.  cmpi.b #2,.pqts(a6)       ;print/skip/abandon clicked?
  17761.  beq .pqsk                 ;go if skip
  17762.  bpl .pqcc                 ;go if abandon
  17763.  
  17764.  move.l #'PRT:',(a4)       ;open PRT:
  17765.  clr.b 4(a4)
  17766.  jsr TLOpenwrite
  17767.  bne.s .pqpo
  17768.  move.w #40,xxp_errn+2(a4) ;go if bad (error 40)
  17769.  bra .pqbd
  17770.  
  17771. .pqpo:
  17772.  move.l .pqla(a6),a3       ;* print lines pqal to pqzl
  17773.  move.l .pqzl(a6),d7       ;a3 = address reached
  17774.  sub.l .pqal(a6),d7        ;d7 counts lines
  17775.  
  17776. .pqln:                     ;print next line
  17777.  move.l a4,a0
  17778.  move.b .pqmg(a6),d0
  17779.  bra.s .pqmm
  17780. .pqnm:
  17781.  move.b #$20,(a0)+         ;send spaces for margin
  17782. .pqmm:
  17783.  subq.b #1,d0
  17784.  bpl .pqnm
  17785. .pqtf:
  17786.  move.b (a3)+,(a0)+        ;send chrs in line
  17787.  bne .pqtf
  17788.  subq.l #1,a0
  17789.  moveq #0,d0               ;point a1 to max line len
  17790.  move.b .pqcl(a6),d0
  17791.  move.l a4,a1
  17792.  add.l d0,a1
  17793.  cmp.l a0,a1               ;make sure not past a1
  17794.  bcc.s .pqsn
  17795.  move.l a1,a0
  17796. .pqsn:
  17797.  move.b #$0A,(a0)+         ;append LF
  17798.  move.l a4,d2
  17799.  move.l a0,d3
  17800.  sub.l d2,d3
  17801.  jsr TLWritefile           ;send to PRT:
  17802.  beq.s .pqcf               ;go if can't
  17803.  dbra d7,.pqln             ;until all lines done
  17804.  
  17805.  move.b #$0C,(a4)          ;send form feed at end of page
  17806.  move.l a4,d2
  17807.  moveq #1,d3
  17808.  jsr TLWritefile
  17809.  beq.s .pqcf
  17810.  
  17811.  jsr TLClosefile           ;close PRT:
  17812.  bra.s .pqsk               ;go to next page
  17813.  
  17814. .pqcf:                     ;here if can't send to PRT: (error 41)
  17815.  move.w #41,xxp_errn+2(a4)
  17816.  bra.s .pqbd
  17817.  
  17818. .pqsk:                     ;* skip to line after end of page
  17819.  move.l .pqal(a6),d0
  17820.  move.l .pqla(a6),a0
  17821. .pqss:
  17822.  tst.b (a0)+
  17823.  bne .pqss
  17824.  addq.l #1,d0
  17825. .pqsf:
  17826.  cmp.l .pqzl(a6),d0
  17827.  ble .pqss
  17828.  move.l d0,.pqal(a6)       ;update pqal,pqla
  17829.  move.l a0,.pqla(a6)
  17830.  bra .pqnx                 ;& to next page
  17831.  
  17832. .pqbd:                     ;exit - error (TLReqshow failed)
  17833.  jsr TLError               ;report error to monitor
  17834.  move.l #287,d0
  17835.  bra.s .pqrp
  17836.  
  17837. .pqcc:                     ;exit - abandon
  17838.  move.l #288,d0
  17839.  bra.s .pqrp
  17840.  
  17841. .pqqt:                     ;exit - all done
  17842.  move.l #289,d0
  17843.  
  17844. .pqrp:                     ;report & quit
  17845.  clr.l xxp_Help(a4)
  17846.  moveq #1,d1
  17847.  moveq #0,d2
  17848.  bsr TLReqinfo             ;report
  17849.  jsr TLError               ;(report to monitor if TLReqinfo failed)
  17850.  rts
  17851.  
  17852. ; TLMultiline "subroutine" - hook for .pqdo (printing) TLReqshow
  17853.  
  17854. .hook:
  17855.  move.l xxp_Stak(a4),a0    ;retrieve A6 when TLReqshow called from xxp_Stak
  17856.  move.l 56(a0),a6
  17857.  
  17858.  move.l d0,d1              ;go if click
  17859.  bmi .hkck
  17860.  
  17861.  cmp.w #12,d1              ;go if line 12+ (i.e. printable lines 0+)
  17862.  bcc.s .hkln
  17863.  
  17864.  move.l #286,d0            ;show line 0-11 (headers)
  17865.  sub.w #2,d1
  17866.  bmi.s .hkhd               ;(lines 0-1 blank)
  17867.  cmp.w #3,d1
  17868.  bmi.s .hkh0               ;(lines 2-4 = print/skip/abandon = str 279=81)
  17869.  sub.w #5,d1
  17870.  bmi.s .hkhd               ;(lines 5-6 blank)
  17871.  cmp.w #3,d1
  17872.  bcc.s .hkhd               ;(lines 10-11 blank)
  17873.  addq.w #3,d1              ;(lines 7-9 instructions = str 282-4)
  17874. .hkh0:
  17875.  add.w #280,d1
  17876.  move.w d1,d0
  17877. .hkhd:
  17878.  jsr TLStra0               ;point to string to be shown
  17879.  rts
  17880.  
  17881. .hkln:                     ;here if printable line clicked
  17882.  move.l .pqla(a6),a0
  17883.  sub.w #12,d1              ;d1 = linum rel to first line
  17884.  move.l .pqzl(a6),d0
  17885.  sub.l .pqal(a6),d0
  17886.  cmp.w d1,d0
  17887.  bcs.s .hkzz
  17888.  bra.s .hklq
  17889. .hklf:
  17890.  tst.b (a0)+               ;point a0 to line to be shown
  17891.  bne .hklf
  17892. .hklq:
  17893.  dbra d1,.hklf
  17894.  rts
  17895.  
  17896. .hkzz:                     ;here if past pqzl
  17897.  move.l a4,a0
  17898.  clr.b (a0)
  17899.  rts
  17900.  
  17901. .hkck:                     ;here if a line clicked
  17902.  bclr #31,d0               ;get linum
  17903.  cmp.w #12,d0
  17904.  bcc.s .hkkl               ;go if 12+ ( = prinatble line 0+)
  17905.  subq.w #1,d0
  17906.  ble.s .hkkz
  17907.  cmp.w #4,d0               ;do nothing if 0-1 or 5-11
  17908.  bcc.s .hkkz
  17909.  move.b d0,.pqts(a6)       ;set .pqts = 1-3 & force quit if 2-4
  17910.  moveq #0,d0
  17911.  rts
  17912.  
  17913. .hkkl:                     ;d0 = linum clicked (rel to .pqal)
  17914.  sub.w #12,d0
  17915.  cmp.l .pqkk(a6),d0
  17916.  bne.s .hkky               ;go if different
  17917.  clr.l .pqkk(a6)
  17918.  moveq #1,d0               ;if already highlighted, turn off
  17919.  rts
  17920.  
  17921. .hkky:
  17922.  move.l .pqzl(a6),d1
  17923.  sub.l .pqal(a6),d1
  17924.  cmp.l d0,d1
  17925.  bcs.s .hkkz
  17926.  move.l d0,.pqkk(a6)       ;note highlighted line
  17927.  moveq #2,d0
  17928.  rts
  17929.  
  17930. .hkkz:                     ;do nothing
  17931.  moveq #-1,d0
  17932.  rts
  17933.  
  17934. ; TLMultiline subroutine - over-ride printer prefs
  17935.  
  17936. .pprf:
  17937.  move.l #311,d0            ;select prefs item
  17938.  moveq #5,d1
  17939.  bsr TLReqchoose
  17940.  cmp.w #1,d0
  17941.  bcs .ppqt
  17942.  beq .pppg
  17943.  cmp.w #3,d0
  17944.  bcs .pppl
  17945.  beq .pppm
  17946.  cmp.w #5,d0
  17947.  bcs .pppf
  17948.  bra .ppqt
  17949.  
  17950. .pppg:                     ;lines/page
  17951.  moveq #0,d0
  17952.  move.b .pqpg(a6),d0
  17953.  move.l a4,a0
  17954.  jsr TLHexasc
  17955.  clr.b (a0)
  17956.  move.l #318,d0
  17957.  moveq #-1,d1
  17958.  moveq #3,d2
  17959.  moveq #0,d3
  17960.  bsr TLReqinput
  17961.  beq .pprf
  17962.  move.l xxp_valu(a4),d0
  17963.  tst.b d0
  17964.  beq .pppg
  17965.  move.b d0,.pqpg(a6)
  17966.  bra .pprf
  17967.  
  17968. .pppl:                     ;chrs/line
  17969.  moveq #0,d0
  17970.  move.b .pqcl(a6),d0
  17971.  move.l a4,a0
  17972.  jsr TLHexasc
  17973.  clr.b (a0)
  17974.  move.l #319,d0
  17975.  moveq #-1,d1
  17976.  moveq #3,d2
  17977.  moveq #0,d3
  17978.  bsr TLReqinput
  17979.  beq .pprf
  17980.  move.l xxp_valu(a4),d0
  17981.  cmp.w #25,d0
  17982.  bcs .pppl
  17983.  cmp.w #161,d0
  17984.  bcc .pppl
  17985.  move.b d0,.pqcl(a6)
  17986.  bra .pprf
  17987.  
  17988. .pppm:                     ;margins
  17989.  moveq #0,d0
  17990.  move.b .pqmg(a6),d0
  17991.  move.l a4,a0
  17992.  jsr TLHexasc
  17993.  clr.b (a0)
  17994.  move.l #320,d0
  17995.  moveq #-1,d1
  17996.  moveq #1,d2
  17997.  moveq #0,d3
  17998.  bsr TLReqinput
  17999.  beq .pprf
  18000.  move.l xxp_valu(a4),d0
  18001.  move.b d0,.pqmg(a6)
  18002.  bra .pprf
  18003.  
  18004. .pppf:                     ;Workbench prefs
  18005.  move.b xxp_lppg(a4),.pqpg(a6) ;get intuition printer prefs
  18006.  move.b xxp_cpln(a4),.pqcl(a6)
  18007.  move.b xxp_marg(a4),.pqmg(a6)
  18008.  bra .pprf
  18009.  
  18010. .ppqt:
  18011.  rts
  18012.  
  18013. ******************* TLMultiline Data ****************
  18014.  
  18015. .str: dc.b 0
  18016.  dc.b 'Project',0 ;1
  18017.  dc.b 'Load',0 ;2
  18018.  dc.b 'Save',0 ;3
  18019.  dc.b 'Save as',0 ;4
  18020.  dc.b 'Print',0 ;5
  18021.  dc.b 'About',0 ;6
  18022.  dc.b 'Stop Editing',0 ;7
  18023.  dc.b 'Go to',0 ;8
  18024.  dc.b 'First line',0 ;9
  18025.  dc.b 'Last line',0 ;10
  18026.  dc.b 'Seek forward',0 ;11
  18027.  dc.b 'Seek back',0 ;12
  18028.  dc.b 'Seek at line start',0 ;13
  18029.  dc.b 'Fwd a window-full',0 ;14
  18030.  dc.b 'Back a window-full',0 ;15
  18031.  dc.b 'Info about text',0 ;16
  18032.  dc.b 'Cut & Paste',0 ;17
  18033.  dc.b 'Insert line',0 ;18
  18034.  dc.b 'Delete line',0 ;19
  18035.  dc.b 'Mark start of Range',0 ;20
  18036.  dc.b 'Mark end of Range',0 ;21
  18037.  dc.b 'Insert Range',0 ;22
  18038.  dc.b 'Delete Range',0 ;23
  18039.  dc.b 'Save Range',0 ;24
  18040.  dc.b 'Insert file',0 ;25
  18041.  dc.b 'Rewrap',0 ;26
  18042.  dc.b 'Spell check Range',0 ;27
  18043.  dc.b 'Erase all (careful!)',0 ;28
  18044.  dc.b 0 ;29
  18045.  dc.b 'LSC!?QAZFBGWVIDMNRP',0 ;30
  18046.  dc.b 'Caution:          bad characters have been removed.',0 ;31
  18047.  dc.b 'Caution:          lines truncated, as >254 chrs (<Help> for info).',0
  18048.  dc.b 'Done OK:          lines split',0 ;33
  18049.  dc.b 'Specify filename...',0 ;34
  18050.  dc.b 'Error: out of memory - can''t keep changes to the line you edited',0
  18051.  dc.b 'Error: start of range is not marked',0 ;36
  18052.  dc.b 'Error: end of range is not marked',0 ;37
  18053.  dc.b 'Error: start of range must be before end of range',0 ;38
  18054.  dc.b 'Error: cannot insert range within its own compass',0 ;39
  18055.  dc.b 'Delete range?',0 ;40
  18056.  dc.b 'Yes (Careful!)',0 ;41
  18057.  dc.b 'No',0 ;42
  18058.  dc.b 'Erase ALL lines?',0 ;43
  18059.  dc.b 'Yes (Careful)',0 ;44
  18060.  dc.b 'No',0 ;45
  18061.  dc.b 'Error: cannot insert range - out of memory',0 ;46
  18062.  dc.b 'Instructions for using this text editor...',0 ;47
  18063.  dc.b '** n.b. some of the options below may be currently disabled **',0
  18064.  dc.b 'Menu: The "Project" menu should be self explanatory.',0
  18065.  dc.b 'The "Go To" menu allows you to navigate thru the text. Most menu',0
  18066.  dc.b 'items cause a requester to appear, when you can press the <Help>',0
  18067.  dc.b 'button for further particulars. Note also menu keyboard bypasses',0
  18068.  dc.b ' ',0 ;53
  18069.  dc.b '          Ctrl                   Shift/Ctrl        Marking a Range',0
  18070.  dc.b ' ',0 ;55
  18071.  dc.b 'a To 1st line   o "Outline"      A Start range     You must mark a',0
  18072.  dc.b 'b Bold          r Right justfy   C Comp (pg turn)  range by',0
  18073.  dc.b 'c Centre        s Shadow         D Delete range    Shift/Ctrl/A +',0
  18074.  dc.b 'd Delete line   u Underline      I Insert range    Shift/Ctrl/Z',0
  18075.  dc.b 'f Full justify  w Wide text      R Restore         before you',0 ;60
  18076.  dc.b 'i Italic        x X-out          S Space fill      Insert, Delete',0
  18077.  dc.b 'l Left justify  z To last line   U Undo            Save Range.',0
  18078.  dc.b '                                 Z End range',0 ;63
  18079.  dc.b 'Ctrl/Up arrow  Superscript',0 ;64
  18080.  dc.b 'Ctrl/Dn arrow  Subscript',0 ;65
  18081.  dc.b ' ',0 ;66
  18082.  dc.b 'The "Multiline" Text Editor you are using....',0 ;67
  18083.  dc.b ' ',0 ;68
  18084.  dc.b 'Is part of the user interface in tandem.library, written by:',0 ;69
  18085.  dc.b ' ',0 ;70
  18086.  dc.b 'Ken Shillito   Email       shillito@tpg.com.au',0 ;71
  18087.  dc.b '               Home Page   http://fast.to/shillito',0 ;72
  18088.  dc.b ' ',0 ;73
  18089.  dc.b 'The Tandem package consists of:',0 ;74
  18090.  dc.b '1. An integrated editor-assembler-debugger called "Tandem"',0 ;75
  18091.  dc.b '2. A progressive hands-on tutor with Tandem to learn assembler',0 ;76
  18092.  dc.b '3. tandem.library  which contains the user interface.',0 ;77
  18093.  dc.b ' ',0 ;78
  18094.  dc.b 'This is version 2.62 of tandem.library, released March 24th 200.',0
  18095.  dc.b 'No load/save took place: Cancel selected',0 ;80
  18096.  dc.b 'Error: can''t put up ASL requester - out of chip mem',0 ;81
  18097.  dc.b 'Error: can''t open file',0 ;82
  18098.  dc.b 'Error: can''t write to file',0 ;83
  18099.  dc.b 'Error: can''t read file',0 ;84
  18100.  dc.b 'Caution: file truncated due to lack of memory in edit buffer',0 ;85
  18101.  dc.b 'Nothing to save: memory buffer is empty',0 ;86
  18102.  dc.b 'Error: file read was empty',0 ;87
  18103. .st88: dc.b 'Longest line     characters - more than currently allowed',0
  18104.  dc.b 'Change longest allowed to above value',0 ;89
  18105.  dc.b 'Divide all too-long lines',0 ;90
  18106.  dc.b 0 ;91
  18107.  dc.b 'Seeking for a string...',0 ;92
  18108.  dc.b 'This text editor does 3 types of string search:',0 ;93
  18109.  dc.b ' ',0 ;94
  18110.  dc.b '1. Seek forward - seeks the first occurence in all lines after the',0
  18111.  dc.b '   current line.',0 ;96
  18112.  dc.b '2. Seek back - seeks the first occurence in all lines before the',0
  18113.  dc.b '   current line.',0 ;98
  18114.  dc.b '3. Seek left - start from the first line, seeks the first',0 ;99
  18115.  dc.b '   occurence of the string, at the beginning of each line.',0 ;100
  18116.  dc.b ' ',0 ;101
  18117.  dc.b 'If you input a null string your most recent non-null input will',0
  18118.  dc.b 'be sought.',0 ;103
  18119.  dc.b ' ',0 ;104
  18120.  dc.b 'By default, the search is case significant. But if you prepend a',0
  18121.  dc.b '| character to your input, the search will be case blind (slower).',0
  18122.  dc.b 'Information about lines in memory               ',0 ;107
  18123.  dc.b '           = Lines in memory      ',0 ;108
  18124.  dc.b '           = Max chrs in a line   ',0 ;109
  18125.  dc.b '           = Words in memory      ',0 ;110
  18126.  dc.b '           = Paras (see <help>)   ',0 ;111
  18127.  dc.b '           = Current line num     ',0 ;112
  18128.  dc.b '           = Memory total used    ',0 ;113
  18129.  dc.b '           = Memory bytes unused  ',0 ;114
  18130.  dc.b 'Paragraphs....',0 ;115
  18131.  dc.b ' ',0 ;116
  18132.  dc.b 'This text editor assumes a paragraph starts with any printable',0
  18133.  dc.b 'non-blank line that does not start with a space. The paragraph',0
  18134.  dc.b 'continues until a line is found that:',0 ;119
  18135.  dc.b ' ',0 ;120
  18136.  dc.b '  - is blank.',0 ;121
  18137.  dc.b '  - has a different justification from the one before.',0 ;122
  18138.  dc.b '  - has a different font / font size from the one before.',0 ;123
  18139.  dc.b '  - changes between fixed / proportional from the one before.',0 ;124
  18140.  dc.b '  - starts with a space.',0 ;125
  18141.  dc.b '  - is non-printable.',0 ;126
  18142.  dc.b ' ',0 ;127
  18143.  dc.b 'Rewrapping, when requested, is done a paragraph at a time.',0 ;128
  18144.  dc.b 'Rewrap incomplete: out of memory',0 ;129
  18145.  dc.b 'Go to line number',0 ;130
  18146.  dc.b 'Line number to go to 1 to',0 ;131
  18147.  dc.b 'Change max line length',0 ;132
  18148.  dc.b 'Error: bad read - memory (probably) left as it was before.',0 ;133
  18149.  dc.b 'Caution: file was empty - memory left as it was before.',0 ;134
  18150.  dc.b 'Input a string for seeking (press <Help> for details)',0 ;135
  18151. .s136: dc.b 'amigaguide.library',0 ;136
  18152. .s137: dc.b 'Multiline.guide',0 ;137
  18153.  dc.b 'Error: can''t open Multiline.guide',0 ;138
  18154.  dc.b 'Error: can''t open amigaguide.library',0 ;139
  18155.  dc.b 'Error: can''t lock CD to open Mutliline.guide',0 ;140
  18156.  dc.b 'View AmigaGuide',0 ;141
  18157.  dc.b 'Maximum line length (10 to 254) (see <Help> for info!!) (currently',0
  18158.  dc.b 'Changing the maximum line length...',0 ;143
  18159.  dc.b 'If you INcrease the maximum line length, all text lines will',0 ;144
  18160.  dc.b 'be unchanged. You will often then choose to do a re-wrap to',0 ;145
  18161.  dc.b 'spread existing lines across the broader range.',0 ;146
  18162.  dc.b ' ',0 ;147
  18163.  dc.b 'If you DEcrease the maximum line length, all the text lines',0 ;148
  18164.  dc.b 'will be re-wrapped. This can cause problems with tables, &c',0 ;149
  18165.  dc.b 'whose lines are too long to fit in the new line length. The',0 ;150
  18166.  dc.b 're-wrapper is fairly intelligent at guessing which lines are',0 ;151
  18167.  dc.b 'formatted, and leaving them alone if possible.',0 ;152
  18168.  dc.b ' ',0 ;153
  18169.  dc.b 'It''s not a bad idea to save the text before you decrease the',0 ;154
  18170.  dc.b 'maximum line length, in case you don''t like the result.',0 ;155
  18171.  dc.b 'You are decreasing the maximum line length (<Help> for info).',0 ;156
  18172.  dc.b 'OK - continue',0 ;157
  18173.  dc.b 'Cancel',0 ;158
  18174.  dc.b 'Instructions for using this text editor...',0 ;159
  18175.  dc.b '(It is currently a viewer only - you can look at, but not edit,',0
  18176.  dc.b 'the text).',0 ;161
  18177.  dc.b 'Menu: The "Project" menu should be self explanatory.',0 ;162
  18178.  dc.b 'The "Go To" menu allows you to navigate thru the text. Most menu',0
  18179.  dc.b 'items cause a requester to appear, when you can press the <Help>',0
  18180.  dc.b 'button for further particulars. Note also menu keyboard bypasses',0
  18181.  dc.b ' ',0 ;166
  18182.  dc.b 'Ctrl a  To first line',0 ;167
  18183.  dc.b 'Ctrl z  To last line',0 ;168
  18184.  dc.b 'Up arrow, down arrow to scroll',0 ;169
  18185.  dc.b 'Shift up arrow, Shift down arrow to go up/down a window-full.',0 ;170
  18186.  dc.b 'Select Unlock in the Project Menu to re-allow you to edit text.',0
  18187.  dc.b 'Lock/Unlock Text',0 ;172
  18188.  dc.b 'Text is now locked (see <Help> for info).',0 ;173
  18189.  dc.b 'Text is now unlocked.',0 ;174
  18190.  dc.b 'Page Formatting',0 ;175
  18191.  dc.b 'Font Select',0 ;176
  18192.  dc.b 'Page Turn',0 ;177
  18193.  dc.b 'Block Turn',0 ;178
  18194.  dc.b 'Page/Block Shape',0 ;179
  18195.  dc.b 'Line Spacing',0 ;180
  18196.  dc.b 'Character spacing',0 ;181
  18197.  dc.b 'Full justify limit',0 ;182
  18198.  dc.b 'Text Pens',0 ;183
  18199.  dc.b 0 ;184
  18200.  dc.b 'Graphics',0 ;185
  18201.  dc.b 0 ;186
  18202.  dc.b 0 ;187
  18203.  dc.b 0 ;188
  18204.  dc.b 0 ;189
  18205.  dc.b 'Line formatting, editing',0 ;190
  18206.  dc.b 'Font Style',0 ;191
  18207.  dc.b 'Bold        Ctrl/b',0 ;192
  18208.  dc.b 'Italic      Ctrl/i',0 ;193
  18209.  dc.b 'Wide        Ctrl/w',0 ;194
  18210.  dc.b 'Shadow      Ctrl/s',0 ;195
  18211.  dc.b 'Superscript Ctrl/up',0 ;196
  18212.  dc.b 'Subscript   Ctrl/down',0 ;197
  18213.  dc.b 'Under/Overlining',0 ;198
  18214.  dc.b 'Single Under   Ctrl/u',0 ;199
  18215.  dc.b 'Over           Ctrl/e',0 ;200
  18216.  dc.b 'Under+Over     Ctrl/f',0 ;201
  18217.  dc.b 'Double Under   Ctrl/g',0 ;202
  18218.  dc.b 'Dbl Under+Over Ctrl/h',0 ;203
  18219.  dc.b 'Dotted Under   Ctrl/o',0 ;204
  18220.  dc.b 'Justification',0 ;205
  18221.  dc.b 'Right Justify Ctrl/r',0 ;206
  18222.  dc.b 'Full Justify  Ctrl/j',0 ;207
  18223.  dc.b 'Center        Ctrl/c',0 ;208
  18224.  dc.b 'Left Justify  Ctrl/l',0 ;209
  18225.  dc.b 'Complement',0 ;210
  18226.  dc.b 'Erase (x-out)  Ctrl/x',0 ;211
  18227.  dc.b 'Undo           Shift/Ctrl/u',0 ;212
  18228.  dc.b 'Restore        Shift/Ctrl/r',0 ;213
  18229.  dc.b 'Space fill     Shift/Ctrl/s',0 ;214
  18230.  dc.b 'GUI Preferences',0 ;215
  18231. .s216: dc.b 'Loaded ok - longest line loaded ..., longest allowed ...',0
  18232.  dc.b 'Leave longest allowed as is',0 ;217
  18233.  dc.b 'Change longest allowed to longest loaded (minimum 20)',0 ;218
  18234.  dc.b 'Change longest allowed to 76',0 ;219
  18235.  dc.b 'You have selected "Erase all"...',0 ;220
  18236.  dc.b 'If Erase all takes place, everything in memory will be lost.',0 ;221
  18237.  dc.b 'If you have saved it to disk, that''s ok. Or, if your are',0 ;222
  18238.  dc.b 'sure you don''t want it, that''s also ok. But otherwise, then',0 ;223
  18239.  dc.b 'after you press OK for this Help requester, select "No" to',0 ;224
  18240.  dc.b 'keep all your lines in memory.',0 ;225
  18241.  dc.b 'You have chosen "Delete Range"...',0 ;226
  18242.  dc.b 'If you now choose "Yes", you will lose irretrievably all the lines',0
  18243.  dc.b 'within the range. If you have already copied them to somewhere',0
  18244.  dc.b 'else, or you''re sure you don''t want them, that''s ok. But if',0
  18245.  dc.b 'you''re unsure, choose "No" to keep them.',0 ;230
  18246.  dc.b 'An error has arisen with respect to operating on a "Range"...',0 ;231
  18247.  dc.b '1. Before you can operate on a Range, you must select the start',0
  18248.  dc.b '   of the range. To do so, place the cursor on a line, and select',0
  18249.  dc.b '   the menu item "Mark start of range".',0 ;234
  18250.  dc.b '2. Then, you must mark the end of the range. Place the cursor on',0
  18251.  dc.b '   any line, from the line you marked as the start onwards, and',0
  18252.  dc.b '   select "Mark end of range".',0 ;237
  18253.  dc.b ' ',0 ;238
  18254.  dc.b 'Your range is then marked. It will remain so, unless you do',0 ;239
  18255.  dc.b 'something (other than "Insert Range") to change the number of',0 ;240
  18256.  dc.b 'lines in memory.',0 ;241
  18257.  dc.b ' ',0 ;242
  18258.  dc.b 'Note that if you choose "Insert range", the cursor cannot be on',0
  18259.  dc.b 'any line within the marked range. Also, if you choose "Insert',0 ;244
  18260.  dc.b 'range", there may not be enough memory to do the insertion.',0 ;245
  18261.  dc.b 'The rewrap could not be completed - out of memory...',0 ;246
  18262.  dc.b 'When rewrapping takes place, there is a very slight chance that',0
  18263.  dc.b 'Multiline will run out of memory. Memory must have been almost',0
  18264.  dc.b 'full when you began the rewrap. So you will find that some lines',0
  18265.  dc.b 'have been rewrapped, and the later ones not. Sorry about that.',0
  18266.  dc.b 'Multiline has run out of memory....',0 ;251
  18267.  dc.b 'You should save your text before you do anything else. You may',0
  18268.  dc.b 'need to divide it up into segments, or otherwise shorten it, as',0
  18269.  dc.b 'won''t fit into the amount of memory that Multiline is using in',0
  18270.  dc.b 'the present application.',0 ;255
  18271.  dc.b 'Strike through',0 ;256
  18272.  dc.b 'Force Fixed',0 ;257
  18273.  dc.b 'Rewrap...',0 ;258
  18274.  dc.b 'From current line to next blank line',0 ;259
  18275.  dc.b 'Everything in memory (careful!)',0 ;260
  18276.  dc.b 'The marked range (if any)',0 ;261
  18277.  dc.b 'Cancel',0 ;262
  18278.  dc.b 'You have selected "Rewrap"....',0 ;263
  18279.  dc.b 'Multiline will scan through the range of lines you select, and if',0
  18280.  dc.b 'any line can have words from the next line tacked onto it, they',0
  18281.  dc.b 'will be so tacked on. That way, paragraphs will be tidied up.',0 ;266
  18282.  dc.b ' ',0 ;267
  18283.  dc.b 'Lines only get rewrapped within their own paragraphs. Paragraphs',0
  18284.  dc.b 'end when a blank line, or a line that starts with a space, occurs.',0
  18285.  dc.b 'If the font/text style &c of successive lines differs, re-wrapping',0
  18286.  dc.b 'never takes place across them.',0 ;271
  18287.  dc.b 'Print...',0 ;272
  18288.  dc.b 'The currently marked range',0 ;273
  18289.  dc.b 'Everything in memory from current line to end',0 ;274
  18290.  dc.b 'Everything in memory from start to end',0 ;275
  18291.  dc.b 'Adjust printer prefs',0 ;276
  18292.  dc.b 'Cancel',0 ;277
  18293.  dc.b 'Printing done - no more lines to print',0 ;278
  18294.  dc.b 'The next page is ready to print...  (press <Help> for info)',0 ;279
  18295.  dc.b '***  Click THIS line (or the Quit button) to PRINT the page    ***',0
  18296.  dc.b '***  Click THIS line to SKIP the page                          ***',0
  18297.  dc.b '***  Click THIS line to ABANDON printing                       ***',0
  18298.  dc.b '*** The lines below are to be printed. Click any of them except **',0
  18299.  dc.b '*** the first, to force that line & lines after it onto the    ***',0
  18300.  dc.b '*** page after next. (If you change your mind, click it again) ***',0
  18301.  dc.b 0 ;286 (must be null)
  18302.  dc.b 'Can''t print - out of mem',0 ;287
  18303.  dc.b 'Printing abandoned',0 ;288
  18304.  dc.b 'Printing finished - no more pages to print',0 ;289
  18305.  dc.b 'You have chosen to print some or all of the lines in memory.',0 ;290
  18306.  dc.b 'When Multiline starts up, it has the printer preferences you',0 ;291
  18307.  dc.b 'have installed in the Amiga Workbench Printer prefs, for the',0 ;292
  18308.  dc.b 'lines per page, left margin width, and characters printed.',0 ;293
  18309.  dc.b ' ',0 ;294
  18310.  dc.b 'If your preferences characters per line is 80, and margins are 5,',0
  18311.  dc.b 'then if you have set Multiline to 76 characters per line, lines',0
  18312.  dc.b 'will get chopped off, since 80 chrs per line minus 5 for the',0 ;297
  18313.  dc.b 'margin equals only 75. So in that case set 0 to 4 for margin.',0
  18314.  dc.b 'The values you set do not change your workbench prefs permanently.',0
  18315.  dc.b 'Multiline is ready to print a page...',0 ;300
  18316.  dc.b 'The requester currently showing lists all the lines which will be',0
  18317.  dc.b 'printed as this page. If you want to cut the page short (e.g. to',0
  18318.  dc.b 'put a page turn at a main heading) then click the line where the',0
  18319.  dc.b 'page turn is to be (of course, not the first line). If you change',0
  18320.  dc.b 'your mind, you can re-click that line to cancel, or click another',0
  18321.  dc.b 'line.',0 ;306
  18322.  dc.b ' ',0 ;307
  18323.  dc.b 'By clicking the lines near the top of the page, you can also chose',0
  18324.  dc.b 'from: print the page, skip the page, or abandon printing. If you',0
  18325.  dc.b 'click the "Quit" button, you will thereby choose print the page.',0
  18326.  dc.b 'Printer prefs...',0 ;311
  18327.  dc.b 'Lines per page',0 ;312
  18328.  dc.b 'Chrs per line',0 ;313
  18329.  dc.b 'Left margin',0 ;314
  18330.  dc.b 'Re-install Workbench printer preferences',0 ;315
  18331.  dc.b 'All now OK',0 ;316
  18332.  dc.b 0 ;317
  18333.  dc.b 'Lines per page (usually 62)',0 ;318
  18334.  dc.b 'Characters per line  25-160  (usually 80)',0 ;319
  18335.  dc.b 'Margin width  0-9  (usually 0)',0 ;320
  18336.  
  18337.  ds.w 0
  18338.  
  18339. .ment:
  18340.  TLnm 1,1      ;Project                    * n.b. This is still re-entrant
  18341.  TLnm 2,2,30   ;  Load                L    * because although TLReqmenu
  18342.  TLnm 2,3,30   ;  Save                S    * changes it, when TLReqmenu
  18343.  TLnm 2,-1     ;                           * re-runs through it, it leaves
  18344.  TLnm 2,4,30   ;  Save as             C    * it alone in its altered form.
  18345.  TLnm 2,-1
  18346.  TLnm 2,5      ;  Print
  18347.  TLnm 2,-1
  18348.  TLnm 2,6,30   ;  About               !
  18349.  TLnm 2,215    ;  GUI Prefernces
  18350.  TLnm 2,141,30 ;  AmigaGuide          ?
  18351.  TLnm 2,172    ;  Lock/Unlock text
  18352.  TLnm 2,-1
  18353.  TLnm 2,7,30   ;  Stop editing        Q
  18354.  TLnm 1,8      ;Go To
  18355.  TLnm 2,9,30   ;  First line          A
  18356.  TLnm 2,10,30  ;  Last line           Z
  18357.  TLnm 2,11,30  ;  Seek forward        F
  18358.  TLnm 2,12,30  ;  Seek back           B
  18359.  TLnm 2,13,30  ;  Seek at line start  G
  18360.  TLnm 2,14,30  ;  Fwd a window-full   W
  18361.  TLnm 2,15,30  ;  Back a window-full  V
  18362.  TLnm 2,130    ;  Go to line number
  18363.  TLnm 2,16     ;  Info about text
  18364.  TLnm 1,17     ;Cut & Paste
  18365.  TLnm 2,18,30  ;  Insert line         I
  18366.  TLnm 2,19,30  ;  Delete line         D
  18367.  TLnm 2,-1
  18368.  TLnm 2,20,30  ;  Mark start          M
  18369.  TLnm 2,21,30  ;  Mark end            N
  18370.  TLnm 2,22     ;  Insert rng
  18371.  TLnm 2,23     ;  Delete rng
  18372.  TLnm 2,-1
  18373.  TLnm 2,24     ;  Save range
  18374.  TLnm 2,25     ;  Insert file
  18375.  TLnm 2,-1
  18376.  TLnm 2,26,30  ;  Rewrap              R
  18377.  TLnm 2,132    ;  Change line length
  18378.  TLnm 2,27     ;  Spell check range   S
  18379.  TLnm 2,-1
  18380.  TLnm 2,-1
  18381.  TLnm 2,28     ;  Erase all (careful!)
  18382.  TLnm 1,175    ;Page Formatting
  18383.  TLnm 2,176    ;  Font Select
  18384.  TLnm 2,177,30 ;  Page Turn           P
  18385.  TLnm 2,178    ;  Block Turn
  18386.  TLnm 2,179    ;  Page/Block Shape
  18387.  TLnm 2,180    ;  Line Spacing
  18388.  TLnm 2,181    ;  Character spacing
  18389.  TLnm 2,182    ;  Full justify limit
  18390.  TLnm 2,183    ;  Text Pens
  18391.  TLnm 2,185    ;  Graphics
  18392.  TLnm 1,190    ;Line formatting, editing
  18393.  TLnm 2,191    ;  Font Style
  18394.  TLnm 3,192    ;    Bold        Ctrl/b
  18395.  TLnm 3,193    ;    Italic      Ctrl/i
  18396.  TLnm 3,194    ;    Wide        Ctrl/w
  18397.  TLnm 3,195    ;    Shadow      Ctrl/s
  18398.  TLnm 3,196    ;    Superscript Ctrl/up
  18399.  TLnm 3,197    ;    Subscript   Ctrl/down
  18400.  TLnm 2,198    ;  Under/Overlining
  18401.  TLnm 3,199    ;    Single Under   Ctrl/u
  18402.  TLnm 3,200    ;    Over           Ctrl/e
  18403.  TLnm 3,201    ;    Under+Over     Ctrl/f
  18404.  TLnm 3,202    ;    Double Under   Ctrl/g
  18405.  TLnm 3,203    ;    Dbl Under+Over Ctrl/h
  18406.  TLnm 3,204    ;    Dotted Under   Ctrl/o
  18407.  TLnm 3,256    ;    Strike Through
  18408.  TLnm 2,205    ;  Justification
  18409.  TLnm 3,206    ;    Right Justify Ctrl/r
  18410.  TLnm 3,207    ;    Full Justify  Ctrl/j
  18411.  TLnm 3,208    ;    Center        Ctrl/c
  18412.  TLnm 3,209    ;    Left Justify  Ctrl/l
  18413.  TLnm 3,257    ;    Force Fixed   Ctrl/p
  18414.  TLnm 2,210    ;  Complement
  18415.  TLnm 2,211    ;  Erase (x-out)  Ctrl/x
  18416.  TLnm 2,212    ;  Undo           Shift/Ctrl/u
  18417.  TLnm 2,213    ;  Restore        Shift/Ctrl/r
  18418.  TLnm 2,214    ;  Space fill     Shift/Ctrl/s
  18419.  TLnm 4,0      ;(End)
  18420.  
  18421.  
  18422. * this table is used by tandem.i to simulate tandem.library's jump table
  18423. * (when Tandem.i sets a pseudo tanbase at TLEndcode+24)
  18424.  
  18425.  IFEQ xxp_what-2           ;#^6  only assemble this table if in tandem.i
  18426.  
  18427.  jmp TLPict
  18428.  jmp TLTabmon
  18429.  jmp TLTabs
  18430.  jmp TLMget
  18431.  jmp TLPrefs
  18432.  jmp TLWscroll
  18433.  jmp TLReqfont
  18434.  jmp TLDropdown
  18435.  jmp TLHexasc16
  18436.  jmp TLGetarea
  18437.  jmp TLEllipse
  18438.  jmp TLData
  18439.  jmp TLProgress
  18440.  jmp TLResize
  18441.  jmp TLPutilbm
  18442.  jmp TLGetilbm
  18443.  jmp TLReqoff
  18444.  jmp TLReqon
  18445.  jmp TLReqchek
  18446.  jmp TLReqredi
  18447.  jmp TLSlimon
  18448.  jmp TLPassword
  18449.  jmp TLSlider
  18450.  jmp TLButtxt
  18451.  jmp TLButprt
  18452.  jmp TLButstr
  18453.  jmp TLPreffil
  18454.  jmp TLPrefdir
  18455.  jmp TLOffmenu
  18456.  jmp TLOnmenu
  18457.  jmp TLReqcolor
  18458.  jmp TLUnbusy
  18459.  jmp TLBusy
  18460.  jmp TLFloat
  18461.  jmp TLWcheck
  18462.  jmp TLWupdate
  18463.  jmp TLMultiline
  18464.  jmp TLWpop
  18465.  jmp TLWsub
  18466.  jmp TLTrim
  18467.  jmp TLWpoll
  18468.  jmp TLReqinfo
  18469.  jmp TLReqmuclr
  18470.  jmp TLReqmuset
  18471.  jmp TLReqmenu
  18472.  jmp TLAssdev
  18473.  jmp TLReqshow
  18474.  jmp TLReqedit
  18475.  jmp TLReqinput
  18476.  jmp TLReqchoose
  18477.  jmp TLReqfull
  18478.  jmp TLReqcls
  18479.  jmp TLReqarea
  18480.  jmp TLReqbev
  18481.  jmp TLWslof
  18482.  jmp TLAslfile
  18483.  jmp TLAslfont
  18484.  jmp TLButmon
  18485.  jmp TLNewfont
  18486.  jmp TLGetfont
  18487.  jmp TLWfront
  18488.  jmp TLTsize
  18489.  jmp TLText
  18490.  jmp TLWclose
  18491.  jmp TLWindow
  18492.  jmp TLKeyboard
  18493.  jmp TLProgdir
  18494.  jmp TLChip
  18495.  jmp TLPublic
  18496.  jmp TLInput
  18497.  jmp TLOutput
  18498.  jmp TLHexasc
  18499.  jmp TLAschex
  18500.  jmp TLClosefile
  18501.  jmp TLReadfile
  18502.  jmp TLWritefile
  18503.  jmp TLOpenwrite
  18504.  jmp TLOpenread
  18505.  jmp TLError
  18506.  jmp TLStra0
  18507.  jmp TLStrbuf
  18508.  jmp TLFsub
  18509.  
  18510.  ENDC              ;#^6
  18511.  
  18512. TLEndcode: ;mark end of program
  18513.